Библиотека ABSDATA

Все, что вы хотели знать о продажах по телефону.

Под капотом Сервисфона

Автосервис 15272 2 +6

Под капотом Сервисфона

мая
2016
19

Автор: Антон Лаудэр, Генеральный директор компании Автомобильные Бизнес Системы

Давно собирался рассказать о том, что находится в подкапотном пространстве Сервисфона. А вчера мне в руки попалась статья инженера Бретта Кифера, который работал над созданием популярного сервиса Trello. Бретт рассказывает о том, как устроен сервис Trello и сколько технологий они перепробовали прежде чем сервис стал таким, каким мы его знаем сейчас. Если в душе вы немного айтишник или, как ещё говорят “человек технического склада ума”, то у меня для вас есть интересная история. Только не судите строго, потому что это мой первый пост про технологии.

 

Стартер: Sugar CRM + FreePBX

Мы перепробовали очень много технологий и продолжаем экспериментировать. Первая версия Сервисфона была реализована на Sugar CRM в связке с сервером телефонии Asterisk и админкой FreePBX. С помощью этих двух систем можно в достаточно короткое время запустить первую версию продукта, такого как Сервисфон.

Так выглядит Sugar CRM:

SugarCRM

А это FreePBX:

FreePBX

 

Первый малолитражный движок: PHP + MySQL + Asterisk

От SugarCRM мы в последствии отказались, потому что в автосервисах было задействовано от силы 5% функционала этой системы и несколько готовых модулей. Остальной функционал лишь мешал пользователям и затруднял разработку. Спустя год мы “созрели” для разработки своего интерфейса и сделали первую версию за пару недель на чистом PHP и MySQL.

Вот так он выглядел:

Old_SP_1

 

Генератор: Node.js + C# + WebKIT

Затем реализовали первую версию витжета для обработки звонков. В качестве сервера использовали Node.js, а клиент был реализован на C#. Ещё мы отказались от FreePBX в пользу чистого Asterisk, потому что количество звонков возросло, а большое количество кода и макросов затрудняло отладку. К тому же, первая версия витжета работала через олдскульный текстовый интерфейс AMI,  через который и по сей день продолжают работать большинство Софтфонов. Так выглядел первый витжет:

Old Witget

Первоначальная идея заключалась в том, что в витжет будет встроен обычный браузер (WebKIT) и весь контент витжета будет формироваться на сервере. Это позволит быстро менять сценарий обслуживания без необходимости обновления витжета на стороне клиента. Но впоследствии мы столкнулись с тем, что WebKIT не поддерживал часть нужного нам функционала, который обычно без проблем работает в обычном браузере. Возникали постоянные проблемы с необходимостью использования AJAX и Javascript.

 

Дизель: PHP Yii2 + PostgreSQL + Node.js

К этому времени накопилось много доработок по системе аналитики, которая была реализована на чистом PHP в связке с MySQL. Так что мы решили переписать систему с использованием фреймворка PHP Yii2. Ещё в ходе ночных дискуссий было решено заодно сменить СУБД на PostgreSQL. Выбор в пользу PostgreSQL был сделан с целью масштабируемости. Лично я впоследствии был очень рад этому выбору, потому что Postgres был больше похож на коммерческие СУБД, к которым я привык. Ранее у меня был опыт использования Oracle и MS SQL Server.

Интерфейс системы аналитики после перехода на Yii2 стал таким, каким вы видите его сейчас:

Yii2_Analytics

 

Гибрид: Google Hangout

Как я написал выше, у нас были трудности с использованием WebKIT. И один гениальный разработчик, с которым мы вместе по ночам “пилили” систему, под впечатлением от Google Hangouts сделал совершенно новую версию витжета, очень похожую на Hangouts. Этот витжет можно посмотреть и установить в Google Apps. Витжет пережил десяток релизов и сейчас готовится новая версия, которая имеет совершенно иную начинку. Стэк используемых технологий пока в секрете 🙂

Google App

 

Сцепление: API и интеграция с внешними приложениями

Наши клиенты, как правило, используют в работе клиент-серверные приложения. Например 1С-Рарус: Альфа-Авто, Далион-авто, Нетикс Трицепс, Автодилер, ТурбоСервис и другие. Чтобы избежать двойного ввода данных, мы интегрируем Сервисфон с этими приложениями. Задача интеграции усложняется тем, что большинство этих систем не поддерживают работу с Websocket или REST API. А если работать с серверами этих систем напрямую, нам пришлось бы каждый раз настраивать VPN-соединение, что во многих случаях не является тривиальной задачей и усложняет поддержку.
Поэтому было решено сделать специальный модуль интеграции, который “висит” на сервере как служба и держит постоянное соединение с нашим вебсокетом. В итоге получаем безопасное соединение по стандартному 80-му порту и совсем небольшой трафик. Служба реализована на C#, обмен данными осуществляется по Websocket в формате JSON. На стороне сервера запросы слушает Haproxy и отправляет их в Ratchet. Хоть это и чисто серверная служба, она все же имеет пользовательский интерфейс, через который ей можно управлять:

AutoLinkScreen

 

Турбина: Haproxy + Ratchet + Rabbit MQ

Когда я впервые прочитал на Хабре про Rabbit MQ, мне очень захотелось как можно быстрее его применить. Дело в том, что количество звонков у нас увеличивается с каждым днем и постоянно возрастает нагрузка на систему. Звонки поступают одновременно и важно обрабатывать их параллельно. Даже секундная задержка при обработке звонка может неприятно влиять на быстродействие системы. Rabbit MQ решает эту задачу и позволяет быстро и легко масштабировать систему. В Rabbit MQ звонки выстраиваются в очередь, а затем специальные воркеры достают эти звонки из очереди и обрабатывают.

rabbitmq-logstash-bug

 

Тест-драйв: Сценарий входящего звонка

Теперь я покажу вам как всё это работает. С помощью одной из моих любимых диаграмм в UML — Sequence Diagram. С помощью этой диаграммы можно легко описать последовательность действий и обмен сообщениями между модулями системы. Я покажу вам описание небольшой части логики, которая реализована в Сервисфоне для обработки входящего звонка.

Итак, наши задачи при поступлении входящего звонка:
1. Принять входящий звонок на сервер телефонии;
2. Найти информацию о клиенте в базе данных Сервисфона;
3. Найти информацию о клиенте в базах данных других приложений, например 1С;
4. Объединить данные;
5. Отправить звонок на нужного человека или отдел и показать имя звонящего клиента на телефонной трубке, а также показать нотификацию о звонке в браузере пользователя;
6. Сообщить о входящем звонке другим приложениям (например: показать уведомление в 1С);
7. Сохранить все данные о звонке в базу данных.

В качестве главного актера я обозначил сервер телефонии. Кроме него в сценарии участвуют объекты:
Call Queue — Очередь звонков. Очередью управляет сервер Rabbit MQ.
Call Worker — Воркер, обработчик очереди звонков, реализован на Yii2.
SQL Database — Основная база данных приложения, управляется СУБД PostgreSQL.
Services Websocket— Отвечает за обмен данными с внешними серверами баз данных. Например c MS SQL Server. Серверная часть реализована с помощью Ratchet. Клиент реализован на C#.
Users Websocket — Отвечает за обмен данными с внешними приложениями. Например с Витжетом и 1С. Серверная часть реализована с помощью Ratchet. Клиент реализован на C#.
Notifications Websocket — Управляет окнами-нотификациями в браузере. Серверная часть реализована на Ratchet. Клиент реализован на Javascript.

Если вы ранее не сталкивались с Sequence Diagram, прочитайте короткое описание здесь.

Incoming Call Flow

 

Заключение

Я не могу охватить все технологии в одной статье и не уверен пока, что у нашего блога есть читатели, которым интересны “тёрки” на техническую тему. Но если вам понравилось, вы можете подписаться на закрытые материалы блога (оставить свой email в окошке ниже) и оставить свой комментарий. Так я буду знать, что вам эта тема интересна и буду присылать вам мысли и подборки статей на техническую тему без цензуры.

Получите доступ

к массе закрытых материалов сайта и черпайте полезную информацию круглосуточно и непрерывно.

2 thoughts on “Под капотом Сервисфона

  1. Илья Александров

    Антон, очень интересная статья. И отличный функционал программы.

Comments are closed.

поиск по сайту