Skip to content

Внутренняя шина событий и архитектура ​

Внутренняя шина событий (internal/events/bus.go) является центральным координатором RUSEON Core. Она полностью изолирует стриминговый видеопайплайн от фоновых асинхронных задач (индексации базы данных, публикации в MQTT, отправки вебхуков и оповещений в веб-интерфейс).


1. Иерархия топиков и подписка по маске (Wildcards) ​

Шина событий поддерживает точечную нотацию и подписку по шаблонам:

  • camera.connected — Конкретное событие подключения камеры.
  • camera.* — Подписка на все события камер (camera.connected, camera.disconnected, camera.reconnecting).
  • recording.* — Подписка на события архива (recording.started, recording.segment_closed, recording.pruned).
  • ai.* — Все события распознавания и детекции нейросетей.

2. Неблокирующая доставка и изоляция потоков ​

Чтобы медленный получатель (например, зависший сервер приёма вебхуков) не замедлял обработку видеопотоков:

  1. Буферизованные каналы Go: Каждый подписчик получает собственный изолированный канал.
  2. Неблокирующий выбор через select ... default:
    go
    select {
    case sub.channel <- event:
        // Событие успешно отправлено в очередь
    default:
        // Канал переполнен: сброс события для медленного подписчика
        atomic.AddUint64(&sub.droppedCount, 1)
    }
  3. Нулевое влияние на видео: Обработка RTSP и WebRTC продолжается с микросекундной задержкой независимо от нагрузки на шину событий.

3. Интеграция с веб-интерфейсом через Server-Sent Events (SSE) ​

Панель управления подписывается на события в реальном времени через эндпоинт SSE:

bash
GET /api/v1/events/stream
Authorization: Bearer <ТОКЕН>

Пример потока данных SSE:

text
event: camera.offline
data: {"camera_id":"cam_entrance","timestamp":1786802400,"reason":"timeout"}

event: ai.detection
data: {"camera_id":"cam_entrance","class":"person","confidence":0.96}

Связанная документация ​

Released under the MIT License.