@startuml title Узел аналитики: взаимодействие сервисов и внешних систем skinparam componentStyle rectangle skinparam wrapWidth 200 skinparam maxMessageSize 200 '=== Внешние системы === cloud "Централ (API5)" as CENTRAL cloud "Видеоноды" as VNODE '=== Узел аналитики === node "Analytics Node" { [ivideon-analytics-controller\n(analytics-controller)] as CTRL [ivideon-analytics-video-proxy\n(analytics-video-proxy)] as PROXY [ivideon-event-saver\n(analytics-event-saver)] as SAVER [ivideon-cloud-vs\n(cloud-vs)] as CLVS [ivideon-analytics-visitor-counter\n(analytics-visitor-counter)] as VC database "База данных\nMongoDB\ncollections:\n- analytics.channels\n- analytics.events" as DB } '=== Связи с Централом (API5) === CTRL -down-> CENTRAL : Периодическая синхронизация\n• Получение списка камер\n• Получение/обновление настроек облачных модулей\n• Оповещение об ошибках\n• Передача метрик PROXY -down-> CENTRAL : Запросы к API5 для получения\nпараметров/доступа к видеопотоку\n(со стороны видеонод) '=== Поток видео === PROXY --> CLVS : Проксирование видеопотока\n(FLV в формате видеонод) PROXY ..> VNODE : Доступ к потокам с видеонод\n(через API5 Централа) '=== WebSocket-взаимодействие === CTRL -left-> PROXY : WebSocket (к серверу PROXY)\nУведомления об ошибках ivideon-analytics-video-proxy CLVS -right-> CTRL : WebSocket (к серверу CLVS)\nСобытия облачного видеосервера '=== Счётчик посетителей === VC --> CTRL : События счётчика (по FLV-потоку)\nдля аналитики '=== Синхронизация состояния через БД === CTRL -down-> DB : Обновление состояния каналов\n(collection: analytics.channels) PROXY -down-> DB : Периодическая вычитка состояния каналов\n• При state=stream_awaited ⇒ выставляет state=streaming\n• Выставление acknowledgment-статусов PROXY -left-> CTRL : Логическая синхронизация состояния\nчерез общую БД (channels) '=== Работа с событиями === CTRL -down-> DB : Обработка и запись событий\n(collection: analytics.events) SAVER -down-> DB : Периодическая вычитка событий SAVER -down-> CENTRAL : Доставка событий в API5\n(тип события ⇒ соответствующий запрос) '=== Легенда === legend right Каналы связи ● HTTP/API: сплошная стрелка ● WebSocket: подпись "WebSocket" ● БД-синхронизация: стрелка к DB с пояснением Коллекции analytics.channels — состояние каналов/ACK analytics.events — события для отправки в облако endlegend @enduml