Внутренняя шина событий и архитектура
Внутренняя шина событий (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. Неблокирующая доставка и изоляция потоков
Чтобы медленный получатель (например, зависший сервер приёма вебхуков) не замедлял обработку видеопотоков:
- Буферизованные каналы Go: Каждый подписчик получает собственный изолированный канал.
- Неблокирующий выбор через
select ... default:goselect { case sub.channel <- event: // Событие успешно отправлено в очередь default: // Канал переполнен: сброс события для медленного подписчика atomic.AddUint64(&sub.droppedCount, 1) } - Нулевое влияние на видео: Обработка 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}