1. Введение 4
2. Постановка задачи 5
3. Обзор 6
3.1. Технические детали проекта ЕБН 6
3.2. Способы реализации динамических атрибутов 9
3.3. Обзор валидаторов JSON-схемы 12
4. Проектирование 15
4.1. Проектирование схемы данных 15
4.2. Структура JSON-схемы атрибутов сущности 16
4.3. Описание API динамических атрибутов 17
5. Реализация 20
5.1. Реализация на уровне базы данных 20
5.2. Доработки в уровне работы с базой данных в коде приложения 21
5.3. Работа с JSON-схемой 21
5.4. Реализация обработчиков 25
6. Апробация 30
6.1. Внутреннее ревью 30
6.2. Тестирование 30
6.3. Документация 31
6.4. Добавление новых атрибутов 31
7. Заключение 32
Список литературы 33
«Единая база номеров» (ЕБН) — внутренний сервис компании «Яндекс» для хранения данных о подключенных телефонных номерах и
информации об их физических и логических подключениях. Данный
сервис используется инженерами компании для аудита номеров и автоматизации рабочих процессов телефонии.
ЕБН хранит информацию о различных объектах реального мира.
Каждый объект имеет свой тип (телефонный номер, договор, партнер
и т.д.), который определяет атрибуты, описывающие свойства данного
объекта.
В последнее время значительно увеличился рост количества задач
по добавлению новых атрибутов к существующим типам объектов приложения. Такие задачи решались разработчиками данного сервиса путем добавления атрибутов в схему базы данных, расширения исходного
кода и вывода добавленных атрибутов в API1 сервиса. Но таких задач
стало возникать очень много, и соответствующая работа занимает у
разработчиков ощутимое количество времени. Усугубляет это положение тот факт, что данные задачи будут и дальше возникать достаточно активно. Связано это с тем, что сервис был запущен относительно
недавно и сейчас его начинают подключать в процессы автоматического
конфигурирования телефонных систем. При этом сервис используется
как инвентарная система, по данным которого конфигурируются другие устройства. Количество и набор атрибутов, используемых в этом
процессе, зависит от типа устройства. Из-за этого при подключении
новых устройств данная проблема будет возникать снова и снова.
Таким образом была поставлена задача по реализации подсистемы
автоматизированного добавления новых атрибутов в данный сервис.
Суть задачи заключается в том, чтобы появилась возможность добавлять новые атрибуты и управлять их значениями через API приложения без ручной доработки исходного кода.
В рамках выполнения данной работы были достигнуты следующие
результаты.
• Был выполнен обзор решений реализации динамических атрибутов, в котором рассматривались подход “EAV”, подход с использованием Hstore и подход с использованием JSONB-документа и
JSON-схемы.
• Была спроектирована подсистема автоматизированного добавления новых атрибутов, основанная на валидации атрибутов с помощью JSON-схемы на стороне приложения и их хранения в виде
JSONB-документа в базе данных.
• Данная подсистема была реализована и протестирована. Было написано более 20 модульных и более 10 интеграционных тестов.
• Динамическими атрибутами были расширены существовавшие обработчики, которые включали CRUD для всех типов объектов,
поиск и массовые внесения номеров.
• Реализация попала в новую версию сервиса.
• Была написана документация, с которой ознакомились администраторы сервиса.
• Администраторы ЕБН, используя данную подсистему, добавили
более 70 атрибутов к четырем типам объектов.
• Значениями добавленных атрибутов были размечены более 10000
объектов сервиса.
Код работы находится в закрытом репозитории.