Цели и задачи разработки сервиса
Основной целью разработки сервиса интеграции является сокращения времени на ввод данных и сокращение количества ошибок, возникающих при повторном вводе данных.
Каждый наш партнер, использующий систему «Сервисфон», использует для управления предприятием и другие системы. Такие как «1С», «Нетикс Трицепс», «Турбосервис» и другие. Все эти системы обрабатывают одну и ту-же информацию: данные о клиентах, продажах, сотрудниках и т.д. Поэтому неизбежно возникает необходимость синхронизации этих данных. Если одни и те-же данные вводятся вручную в разные системы, это порождает лишние трудозатраты и большое количество ошибок. Поэтому, необходима единая «шина», которая бы обеспечила непрерывный процесс автоматической синхронизации данных.
В рамках данного ТЗ рассматриваются задача синхронизации между 3-мя системами:
Сервером телефонии Asterisk
Сервером ServicePhone CRM
Сервером 1С
Рабочими станциями 1С
Существующие решения
На рынке существует большое количество решений для интеграции данных. Например JBoss, Microsoft BizTalk и другие. Но эти системы достаточно сложные для внедрения и обслуживания. Поэтому, мы решили реализовать собственный сервис интеграции, который будет решать несколько специфических задач.
Технические ограничения
При реализации мы столкнулись с несколькими важными ограничениями:
1С (особенно ранних версий) имеет ограниченные возможности по интеграции. Например, нет возможности работать с JSON или Websocket. Поэтому мы реализовали специальный модуль для 1С, который умеет считывать данные по локальному порту в формате JSON и отправлять ответ на этот же порт.
ServicePhone CRM находится в облаке, а клиентские приложения 1C обычно установлены на нескольких рабочих станциях у партнера за NAT. При этом, как правило, у партнера настроен Firewall. Поэтому единственным возможным интерфейсом для обмена данными является Websocket на стандартном HTTPS (443) порту.
Некоторые запросы требуется отправлять на рабочую станцию 1С, а некоторые напрямую на сервер, в базу данных. Например, поиск клиента по номеру телефона целесообразно осуществлять на сервере 1С. А при поступлении звонка необходимо оповещать рабочие станции (чтобы открыть карточку клиента в приложении 1С). Поэтому наш сервис интеграции устанавливается и на сервер и на рабочие станции.
Архитектура решения
Мы разработали API Server, который отвечает за обмен данными между системами. На этот сервер поступают http-запросы от сервера телефонии и сервера CRM. Для связи с 1С и подобными системами мы разработали Websocket Router, потому что Websocket – это почти единственный возможный интерфейс обмена данными в нашем случае (см. ограничения). Сама 1С напрямую не умеет работать с Websocket, поэтому на клиентских рабочих станциях мы устанавливаем службу Windows, которая постоянно работает в фоновом режиме и поддерживает соединение c Websocket Router.
Ниже приведена диаграмма компонентов системы:
Рассмотрим по-отдельности компоненты системы.
PBX
Система телефонии. которая обрабатывает звонки. В процессе обработки звонков передает события в HTTP-API по протоколу HTTPS. Реализована на Kamailio + Asterisk.
PBX HTTP-API
HTTP-API используется для связи с системой телефонии. Умеет принимать информацию о звонках по HTTPS и передавать её в Rabbit MQ в формате JSON. Реализован на nginx + Yii2.
Подробное описание событий API можно прочитать здесь: Описание ServicePhone CALLS API
Rabbit MQ
Сервер Rabbit MQ используется для передачи сообщений между модулями системы. Как работает Rabbit MQ написано здесь. В нашем случае он нужен, чтобы при большой нагрузке сервер API не зависал и отвечал на запросы быстро.
Workers
Воркеры проверяют сообщения в RabbitMQ и обрабатывают их. В воркерах созредоточена вся логика API. Описание воркеров: ServicePhone API Workers
Websocket Router
Websocket Router используется для связи с внешними сервисами: Windows Integration Service и системой уведомлений. Протокол Websocket позволяет передавать информацию на удаленные сервера по стандартному https-порту в формате JSON. Websocket Router реализован на Yii2 + Ratchet. Тут можно посмотреть пример простого приложения на Ratchet: Hello World. Задача роутера очень проста: поддерживать соединение и передавать запросы JSON. А вся бизнес-логика находится в воркерах, которые описаны ниже.
Вот тут находится роутинг запросов Websocket:
Supervisor Command:
Пример кода для тестирования подключения к Websocket из браузера (консоль Google Chrome):
var conn = new WebSocket('wss://dev-wsapi.absdata.ru/services?key=turbo-data-import&secret=turbo-data-import&clientType=api'); conn.onopen = function(e) { console.log("OPEN"); }; conn.onclose = function(e) { console.log("CLOSE"); }; conn.onmessage = function(e) { console.log(e.data); }; (e) { console.log(e.data); }
PostgreSQL Database
Реляционная база данных, которая хранит все данные и обеспечивает их целостность. Операции по записи и чтению данных в реляционной БД очень затратны, поэтому данные сюда попадают уже после полной обработки. По возможности лучше кэшировать данные, чтобы избегать повторного считывания.
Описание базы данных:
Структура БД: Пользователи, сервисы и авторизация
Структура БД: Данные о звонках
Структура БД: Данные о клиентах
ServicePhone Notifications
Система уведомлений о входящих звонках, которая использует Notifications API браузера. Подключается к Websocket Router. Как работают уведомления можно прочитать здесь: Сервисфон - Система уведомлений
ServicePhone Integration Service
Служба Windows, которую мы устанавливаем на сервера и рабочие станции наших партнеров. Она поддерживает постоянное соединение с Websocket Router: принимает и передает запросы в формате JSON. Далее передает запросы во внешние системы типа 1С на понятном для этих систем языке (как правило SQL).
Протокол обмена данными здесь: Протокол обмена данными с ServicePhone Integration Service
Внешние системы
Из внешних систем собираются данные о клиентах, автомобилях, заказах т.д. Так же в эти системы отправляются данные о звонках. Взаимодействие с внешними системами реализовано через драйвер базы данных (например через ADO.Net) или на уровне приложений (например через Named Pipes). Тут собраны примеры запросов во все системы на языке SQL: SQL: Запросы к внешним базам данных
Логи
Для хранения и анализа логов используется ELK. Инструкция по использованию тут.
Логи пишутся в стандартном формате Yii2. В коде обязательна проверка ошибок и сообщение информации по контрольным точкам.
Подготовка рабочего места
Для работы необходима операционная система Linux или MacOS. Список облачных систем и локальных и инструментов, необходимых для работы: Инструменты разработчика API