Описание технической архитектуры ПО “Сервис видеоконсультаций Voda”
Тип архитектуры
Клиент-серверное веб-приложение (SaaS).
Приложение имеет монолитную архитектуру + встраиваемый в web страницы клиентов виджет на JavaScript.
Схемы взаимодействия
Клиент инициирует связь с виджета (код виджет загружается с сервера бэкэнда CCS.Voda) на сайте заказчика. Запрос идет к серверу бэкэнда CCS.Voda по сокету, поверх https. Сервер бэкэнда CCS.Voda уведомляет всех доступных консультантов по сокету в их веб интерфейс.
Когда один из консультантов принимает звонок, инициализируется стандартный механизм для установки WebRTC соединения, где в качестве сервера SIP используется тот же сервер бэкенда CCS.Voda: клиенты обмениваются оффером и ансвером исходя из настроек и возможностей оборудования, далее обмениваются ICE кандидатами.
Для установления информации о возможных маршрутах подключения (ICE-candidate) каждый из клиентов может обращаться к STUN серверу (если клиент например находится за NAT). После обмена кандидатами, соединение устанавливается либо напрямую peer-to-peer, либо в некоторых случаях, при невозможности установить прямого соединения через сервер TURN (в нашей реализации сервер STUN и TURN - один и тот же сервер использующий программное обеспечение coturn).
Во время консультации для обеспечения согласованности состояния звонка, в том числе и завершения звонка, используется сервер бэкенда CCS.Voda, но не для передачи видео/аудио. Чат в настоящей реализации сделан на технологии web сокетов и использует сервер бэкенда CCS.Voda, и не использует WebRTC.
Архитектура Бэкенда
Бэкенд написан на nodejs и отчасти является веб-сервером (обработка статики делегирована nginx).
Архитектуру построения приложение определяет платформа GoCore (CCS.Core), которая обеспечивает строгую архитектуру взаимодействия компонентов.
Обработка запросов производится по двум каналам:
- Классические http(s) запросы. Для упрощения обработки используется фреймворк Express.
- Соединение по WebSocket. После установки соединения, применяется аналгичная http схема запрос-ответ, то есть, с точки зрения фронтенда, в большинстве сценариев, не отличается от классического fetch. Однако позволяет в некоторых сценариях уведомлять клиента, а также держать открытым соединение и не выполнять аутентификацию при каждом запросе.
Все запросы идут через единый внутренний api, который занимается валидациями, проверкой доступов, прочими ограничениями и проверками и отправляют запрос в методы классов.
Каждый класс имеет свое отражение в базе данных, в виде, таблицы с данными данной сущности, профайлов, с описаниями настроек самого класса, его полей.
Метод класса реализует бизнес-логику, используя для взаимодействия с бд встроенные методы, и возвращает результаты своей работы обратно клиенту в единообразном формате.
Фронтенд бэкофис + модуль консультанта
Архитектуру бэкофиса, также как и бэкенда определяет платформа GoCore (CCS.Core).
Платформа предоставляет базовый механизм взаимодействия с серверов, включая авторизацию, набор компонентов, таких как Меню, Таблицы, Формы, Фреймы, и встроенные в них фильтры, выпадающие списки, различные виды редакторов.
Все компоненты плотно интегрированы с бэкендом, определяя поведение, внешний вид, формирования данных и запросов на получение/изменения данных, с учетом их связей.
Используя готовые компоненты, и кастомный код построен бэкофис для пользователей системы. Набор бэкофиса определяется сервером, на основе ролей конкретного пользователя.
Модуль консультанта
Модуль консультанта написан отдельным проектом на React и встроен в общий бэкофис. Помимо расположения в общем интерфейсе, он также использует общее подключение и его поведение также может быть определено настройками ролей.
Фронтенд виджет
Написан как отдельный проект на React и имеет архитектуру принятую данным фреймворком. Устанавливает соединение с бэкендом по web-сокету и использует предусмотренное для него API.
Собирается в js бандл, который клиент может подключить к себе на сайт и инициализировать.