Шина событий (Event Bus)
Внутренняя шина событий (pkg/eventbus/eventbus.go) обеспечивает асинхронную неблокирующую маршрутизацию сообщений между подсистемами RUSEON Core.
Структура события
Каждое событие в системе строго типизировано структурой Event:
go
type Event struct {
ID string `json:"id"`
TimestampMs int64 `json:"timestamp_ms"`
Topic string `json:"topic"`
CameraID string `json:"camera_id,omitempty"`
Data map[string]interface{} `json:"data,omitempty"`
}Системные топики событий
| Топик | Условие срабатывания | Поля полезной нагрузки (Data) |
|---|---|---|
camera_online | Камера подключена по RTSP и транслирует видеокадры. | id |
camera_offline | Разрыв RTSP соединения или ошибка подключения. | id, error |
archive_segment_ready | Завершена и финализирована запись fMP4 сегмента на диск. | camera_id, file, duration |
recording_failed | Ошибка ввода-вывода (I/O) файловой системы при записи архива. | camera_id, error |
storage_warning | Заполнение дискового пространства превысило порог 90%. | used_percent, path |
Последовательная обработка (Consistent Hashing)
Для предотвращения гонок состояний (когда событие camera_offline могло бы обработаться раньше предшествующего camera_online), шина использует консистентное хэширование (FNV-1a) по CameraID:
- Все события одной камеры всегда направляются в один и тот же рабочий поток (worker goroutine).
- Размер пула по умолчанию: 4 воркера, каждый с канальным буфером на 1 000 событий.
Политика защиты от переполнения (Drop-Newest)
Шина событий реализует жесткую политику сброса новых сообщений при переполнении очереди:
- Если очередь воркера заполнена (например, из-за зависшего внешнего HTTP вебхука), новые события для этого воркера отбрасываются, сохраняя работоспособность видеопайплайна.
- Количество сброшенных событий фиксируется в счетчике Prometheus
ruseon_eventbus_drops_total.