Skip to content

Журнал архитектурных решений (ADR) ​

В этом документе зафиксированы ключевые архитектурные решения, принятые при разработке RUSEON Core, их контекст, рассмотренные альтернативы и результаты.


ADR-001: Реализация на чистом Go (Zero CGO) ​

  • Контекст: Традиционные видеосерверы на C/C++ подвержены ошибкам работы с памятью (Use-After-Free, переполнение буфера) и сложны в кросс-компиляции.
  • Решение: Разработка RUSEON Core исключительно на чистом Go без CGO.
  • Результат: Детерминированная безопасность памяти, простая кросс-компиляция (Linux ARM64/AMD64, Windows) и поставка в одном бинарном файле.

ADR-002: Архитектура Zero-Transcoding Transmuxing ​

  • Контекст: Транскодирование видео 1080p/4K сжигает колоссальные ресурсы CPU/GPU, ограничивая количество камер на сервер.
  • Решение: Чистый трансмуксинг (переупаковка NALU-пакетов в форматы RTP, fMP4, HLS) без декодирования пикселей.
  • Результат: Снижение нагрузки на CPU более чем на 90%, позволяющее 12-ядерному серверу обслуживать 600+ камер с сохранением оригинального качества.

ADR-003: Архивация видео во фрагментированный MP4 (fMP4) ​

  • Контекст: Обычные MP4-файлы пишут заголовок moov в конце файла. Внезапный сбой питания повреждает всю запись.
  • Решение: Сохранение записей во фрагментированный MP4 (moof + mdat на каждый GOP).
  • Результат: 100% устойчивость к сбоям; каждый сброшенный отрезок готов к воспроизведению сразу после аварии.

ADR-004: Сброс кеша страниц ядра Linux (POSIX_FADV_DONTNEED) ​

  • Контекст: Непрерывная запись сотен камер забивает Page Cache оперативной памяти, приводя к зависаниям I/O и срабатыванию OOM Killer.
  • Решение: Использование sync_file_range для фонового сброса и POSIX_FADV_DONTNEED для вытеснения страниц из RAM.
  • Результат: Исключено вымывание кеша страниц; потребление памяти остается плоским (~471 МБ RSS при 600 камерах).

ADR-005: Встраиваемая база данных BadgerDB v4 LSM ​

  • Контекст: Внешние СУБД (PostgreSQL/MySQL) усложняют развертывание и обслуживание.
  • Решение: Встраивание BadgerDB v4 (чистый Go LSM-движок с MemTable 16 МБ).
  • Результат: Автономность, субмиллисекундные выборки по таймлайну и атомарные бэкапы без внешних зависимостей.

ADR-006: Стандарт WHEP (WebRTC HTTP Egress Protocol) ​

  • Контекст: Проприетарные WebSocket-протоколы сигнализации сложны в балансировке и интеграции.
  • Решение: Принятие стандарта IETF WHEP (POST /stream/webrtc/whep/:id).
  • Результат: Стандартная RESTful сигнализация, прозрачная работа через Reverse Proxy и единый порт UDP.

ADR-007: Адаптивный батчинг сетевых пакетов sendmmsg на Linux ​

  • Контекст: Отправка тысяч отдельных UDP-пакетов в секунду перегружает ядро Linux системными вызовами и переключениями контекста.
  • Решение: Обертка сокетов BatchingUDPMuxConn с вызовом sendmmsg, накапливающая до 32 пакетов или сбрасывающая батч по маркерному биту кадра ($M=1$).
  • Результат: Снижение нагрузки на ядро на 85–90% при раздаче WebRTC тысячам зрителей.

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

Released under the MIT License.