Skip to end of metadata
Go to start of metadata

Цели и задачи разработки сервиса

Основной целью разработки сервиса интеграции является сокращения времени на ввод данных и сокращение количества ошибок, возникающих при повторном вводе данных.

Каждый наш партнер, использующий систему «Сервисфон», использует для управления предприятием и другие системы. Такие как «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:

[program:websocket-api]
command=php /var/www/servicephone-api/bin/websocket.php
process_name=%(program_name)s_%(process_num)02d

Пример кода для тестирования подключения к 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

  • No labels