На Хабре засветился крутой opensource-проект: BinaryRPC — легковесный RPC-фреймворк на современном C++ с WebSocket-транспортом. 💡 Зачем? Чтобы упростить взаимодействие между сервисами без лишнего оверхеда. Фишки: минимализм, скорость работы и отсутствие зависимостей. 🔥 Авторы обещают удобный API и поддержку асинхронных операций. Код уже на GitHub — пишут, что отлично подойдёт для embedded или highload. Кто пробовал такие решения? Делимся опытом в комментах! 👇 #opensource #cpp #dev
Executive Technical Summary
BinaryRPC — высокопроизводительный RPC-фреймворк для C++, спроектированный для low-latency приложений: многопользовательских игр, финансовых платформ и IoT-систем. Построенный на базе uWebSockets с использованием системных вызовов epoll/kqueue, фреймворк обеспечивает пропускную способность свыше 100K сообщений/сек при задержках <1ms. Ключевые инновации включают трехуровневую систему QoS (None/AtLeastOnce/ExactlyOnce), stateful-сессии с автоматическим восстановлением, модульную архитектуру middleware и заголовочную реализацию (header-only). Фреймворк позиционируется как альтернатива gRPC для сценариев, где критичны минимальные накладные расходы и детерминированное поведение.
Архитектура и Основные Принципы (H2)
Многоуровневая модель обработки (H3)
Архитектура реализует конвейер обработки запросов:
-
Транспортный слой (ITransport)
- Реализация на uWebSockets с callback-обработчиками событий
- Поддержка кастомизации через
IHandshakeInspector
-
Протокольный слой (IProtocol)
- Плагинная поддержка MsgPack, SimpleText, JSON
- Бинарная сериализация с нулевым копированием данных
-
Middleware-цепочка
- Последовательная обработка в порядке регистрации
- Глобальные, метод-специфичные и групповые обработчики
Система сессий (H3)
- Автовосстановление состояния: При переподключении в течение
sessionTtlMs(конфигурируемо) сессия сохраняет:- Состояние переменных (через
FrameworkAPI::setField()) - Недоставленные сообщения QoS 1/2
- Индексные поля для O(1) поиска
- Состояние переменных (через
- Жизненный цикл: Управляется через
SessionManagerс возможностью интеграции внешних хранилищ
Надежная Доставка и QoS (H2)
Трехуровневая модель гарантий (H3)
| Уровень QoS | Механизм | Сценарии использования |
|---|---|---|
| None | Fire-and-forget | Таймкритичные события (игровые позиции) |
| AtLeastOnce | ACK + экспоненциальный бэкофф | Транзакционные операции |
| ExactlyOnce | 2PC с IDEMPOTENCY_KEY | Финансовые транзакции |
Кастомизация политик (H3)
Практическое Внедрение (H2)
Шаблоны интеграции (H3)
-
Аутентификация через JWT
-
Управление ресурсами через Token Bucket
Производительность в продакшн (H3)
- Бенчмарки:
- 12K RPS на Intel Xeon 3.5GHz с задержкой P99 <5ms
- Память: 150 байт/сессия + 40 байт/сообщение в очереди
- Ограничения:
- Stateful-архитектура требует шардинга для >500K одновременных сессий
- Обязательное использование C++20
Сравнение с Альтернативами (H2)
| Параметр | BinaryRPC | gRPC | REST over WebSockets |
|---|---|---|---|
| Latency (P99) | 0.8 ms | 3 ms | 5 ms |
| Потребление памяти | 15 MB | 45 MB | 30 MB |
| Поддержка сессий | ✔️ Stateful | ❌ | ❌ |
| ExactlyOnce | ✔️ | ❌ | ❌ |
Roadmap и Рекомендации (H2)
- Краткосрочные улучшения:
- Интеграция с Apache Arrow для сериализации
- Плагин кеширования сессий в Redis
- Стратегия внедрения:
- Старт с QoS Level=0 для high-throughput сценариев
- Постепенное внедрение ExactlyOnce для финансовых операций
- Ограничения:
- Отсутствие встроенной кластеризации (требуется external sharding)
- Сложность отладки race conditions в lock-free реализациях
Экспертное Заключение
BinaryRPC заполняет нишу low-latency RPC-решений для C++, предлагая уникальные возможности: stateful-сессии с TTL, TLS-like handshake и детерминированную доставку. Фреймворк демонстрирует готовность к production при нагрузках до 50K RPS, но требует зрелых DevOps-практик для управления stateful-инфраструктурой. Для старта рекомендован QoS=None в IoT-сценариях с поэтапным переходом на ExactlyOnce в финансовых системах.