Журнал архитектурных решений (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 тысячам зрителей.