Всем привет! Сегодня хочу зажечь настоящий холивар — но с практическим уклоном. Речь пойдет о нашем большом рефакторинге, вернее, о почти полном переписывании ядра нашего API-гейтвея.
Немного контекста: У нас классический монолит на Java (Spring Boot), который неплохо служил нам лет 5. Но с ростом нагрузки до 100k+ RPS мы уперлись в лимиты:
Потребление памяти под 16-32 GB на инстанс
GC паузы по 200-300ms в пике
Стоимость облачной инфраструктуры стала сопоставима с зарплатой нескольких миддлов
И мы приняли решение — переписать самые горячие пути на что-то более эффективное. Кандидаты: Go, Rust и современный C++.
Go: модный и быстрый на старт
Плюсы:
Простота написания конкурентного кода (горутины — это действительно круто)
Быстрая компиляция
Отличная стандартная библиотека для сетевых задач
Минусы, с которыми столкнулись:
Сборка мусора всё ещё дает просадки, хоть и меньше чем в Java
Нет настоящей работы с памятью — в некоторых сценариях это критично
Вердикт: Идеально для быстрого старта, но не дает того контроля, который хочется в ядре системы.
Rust: хайп и реальность
Плюсы:
Нулевая стоимость абстракций — это не шутка
Гарантии безопасности памяти без GC
Невероятно умный компилятор
Минусы на практике:
Кривая обучения круче, чем кажется
Время компиляции в больших проектах измеряется минутами
Некоторые концепции (lifetimes) требуют переосмысления архитектуры
Вердикт: Мощно, но дорого в разработке и поддержке.
C++23: старый добрый друг с новыми трюками
Что удивило:
Модули наконец-то работают как надо
Coroutines в стандартной библиотеке
Концепты делают шаблоны читаемыми
Меньший оверхед по памяти чем у Go и Rust
Боль:
До сих пор нет нормальной системы пакетов (хотя vcpkg и Conan спасают)
Нужны очень опытные разработчики
Наш выбор и почему
После 3 месяцев прототипов и бенчмарков мы остановились на... Zig.
Шутка! Хотя Zig мы тоже смотрели — но для продакшена рано.
Реальный выбор — Rust. И вот почему:
Долгосрочная выгода: Да, первые 2 месяца скорость разработки была ниже. Но потом — стабильный рост без дебаггинга багов с памятью и data races.
Экосистема: Tokio + Hyper показали производительность лучше чем Go net/http и сравнимую с оптимизированным C++.
Компиляция в WASM: Это оказалось killer feature! Мы можем компилировать отдельные модули в WASM и запускать их в разных средах.
Что в сухом остатке через 6 месяцев:
Потребление памяти: упало в 4-5 раз
Производительность: выросла в 2-3 раза
Количество багов: критических — почти ноль
Стоимость инфраструктуры: уменьшилась на 60%
Вывод: Не существует идеального языка. Но есть идеальный язык для вашей команды и задачи. Для нас это оказался Rust — несмотря на все сложности, он дал тот уровень контроля и производительности, который нам был нужен.
А что выбираете вы для высоконагруженных сервисов в 2025? Делитесь в комментах!
P.S. Кто заинтересовался — в следующем посте распишу наш стек инструментов для Rust в продакшене: мониторинг, дебаггинг, деплой...