Skip to content

Шина событий (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.

Released under the MIT License.