Перенос медиасервера Flussonic с Erlang на Rust: рост производительности в 5 раз и сокращение времени CI с 40 до 4 минут
Основатель и главный архитектор Flussonic Макс Лапшин представил развернутый доклад о результатах грандиозного инженерного проекта — переписывания ядра медиасервера Flussonic с языка Erlang на Rust. Продукт обслуживает около 250 миллионов телезрителей по всему миру в 100 странах и обрабатывает телеметрию более 1 миллиона подключенных видеокамер.
Замена языка программирования в работающем высоконагруженном бизнес-продукте с 17-летней историей считалась бы самоубийственным решением без применения современных AI-агентов. Однако сочетание промпт-инжиниринга, формата спецификаций OpenSpec и редакторов Cursor/Claude позволило команде совершить квантовый прыжок в производительности и скорости разработки.
Истоки проекта, 17 лет на Erlang и кадровый тупик
Выбор языка Erlang в 2007 году был абсолютно оправданным: отличная модель акторов (BEAM), легковесные процессы, отказоустойчивость и нативная поддержка асинхронного ввода-вывода выделяли его на фоне C++ или Java. На Erlang проект успешно вырос и закрепился на международном рынке.
Однако к 2024 году Erlang превратился в узкое место развития:
- Острейший дефицит кадров: рынок Erlang-разработчиков крайне мал. Попытки нанять инженеров исчерпали доступный путевой резерв в десятках стран, а обучение новичков занимало до полугода.
- Маргинализация экосистемы: современные сетевые протоколы, такие как Media over QUIC (MoQ), активно развиваются в сообществах Rust и C++. Для Erlang готовых бинарных библиотек высокого качества просто нет, что заставляло команду писать все с нуля.
- Падение темпа фич: задержки в интеграции новых протоколов начали напрямую угрожать конкурентоспособности продукта на мировом рынке видеостриминга.
Почему Erlang уперся в потолок: экосистема Media over QUIC и сборка мусора
Помимо кадрового голода, проявились и чисто технические фундаментальные ограничения виртуальной машины BEAM. При обработке сотен гигабит видеопотоков в секунду сборщик мусора (GC) Erlang создает ощутимые хвостовые задержки (tail latency) при аллокации памяти под короткоживущие бинарные буферы сетевых пакетов.
Rust предлагает строгую модель владения памятью (Ownership & Borrow Checker) без сборщика мусора, что обеспечивает предсказуемое время отклика на сетевых сокетах. Кроме того, экосистема асинхронного ввода-вывода Tokio в сочетании с векторными инструкциями и ручной оптимизацией структуры данных позволила полностью устранить накладные расходы контекстных переключений.
Методология переписывания: OpenSpec, Cursor и промпт-инжиниринг
Основным драйвером миграции выступил сам Макс Лапшин, активно использовавший связку из Claude 3.5 Sonnet, Cursor и Claude Opus. Ключом к успеху стало не абстрактное генеративное написание кода, а жесткий формализм входных спецификаций.
Формат OpenSpec позволил превратить передачу контекста ИИ в структурированную процедуру. Вместо скармливания нейросети сырых исходников на Erlang, инженер составлял спецификацию с описанием входных бинарных кадров, состояний автоматов и правил обработки ошибок.
Инженерный процесс миграции строился по следующей схеме:
- Снятие эталонного поведения (Behavior Extraction): старый модуль на Erlang покрывался интеграционными тестами, фиксирующими бинарный протокол и пограничные случаи.
- Форматирование в OpenSpec: поведение модуля декларировалось в виде формата OpenSpec — структурированного текста, описывающего инварианты и структуры данных.
- Генерация каркаса на Rust: ИИ-редактор Cursor получал OpenSpec-документ и генерировал первичную реализацию модуля на Rust.
- Автоматическая проверка и ревью: модуль запускался против эталонных тестов. Все расхождения возвращались ИИ в виде контекста ошибок для моментального исправления.
Впечатляющие результаты: 15 000+ видеокамер на сервер и 4-минутный CI
Переход ядра Flussonic на Rust принес результаты, превзошедшие первоначальные ожидания инженеров:
- Рост плотности в 5 раз: на том же самом серверном оборудовании один узел Flussonic теперь обслуживает не 3 000, а более 15 000 одновременных видеопотоков с IP-камер.
- Сокращение времени CI с 40 до 4 минут: за счет эффективного компилятора Rust и параллельного тестирования время полного прохождения пайплайнов непрерывной интеграции сократилось в 10 раз.
- Снижение потребления RAM: оперативная память расходуется детерминированно, без скачков, вызванных задержками сборки мусора Erlang.
- Кадровый прорыв: на смену узкой нише Erlang компания получила доступ к огромному сообществу квалифицированных Rust-инженеров.
Практический пошаговый порядок миграции медийных и сетевых сервисов
При планировании переноса legacy-сервисов сетевой инфраструктуры на современные системные языки рекомендуется следующая последовательность шагов:
- Инвентаризация и сужение контура: выделите минимально связный сетевой модуль (парсер протокола, сессионный менеджер, буфер кадра) для первой закрепительной миграции.
- Формализация интерфейса через OpenSpec: описать поведение модуля в формате точных спецификаций с указанием структур данных, типов ошибок и состояний.
- Написание сквозных е2е-тестов: зафиксируйте ожидаемые бинарные пакеты и сетевые ответы на уровне тестовых заглушек.
- Генерация кода с помощью AI: подгружайте спецификации и интерфейсы в ИИ-редактор для получения базового кода на Rust.
- Тестирование под нагрузкой: проведите синтетическое нагрузочное тестирование с измерением профиля памяти и хвостовых задержек.
- Канареечный rollout: включайте новый Rust-модуль в продакшене под флагом с возможностью мгновенного переключения на старый код.
Резюме и выводы: роль ИИ в спасении зрелых инженерных кодовых баз
Кейс Flussonic доказывает, что ассистируемый искусственным интеллектом рефакторинг открывает новую эру в разработке программного обеспечения. Системные кодовые базы, ранее считавшиеся заложниками устаревших экосистем и кадрового дефицита, теперь могут быть безопасно и эффективно перенесены на современный стек Rust с многократным экономическим и технологическим выигрышем.

