HermitMQ это высокопроизводительный брокер сообщений с открытым исходным кодом, написанный на Go специально для highload систем, где стандартные решения создают избыточную задержку и нагрузку на сборщик мусора. За счёт отказа от тяжеловесных фреймворков сериализации в пользу кастомного 29 байтного бинарного протокола, использования mmap-индексированного Write Ahead Log и чтения по принципу zero copy, брокер преодолевает отметку в 2 000 000 сообщений в секунду (пропускная способность свыше 3.4 ГБ/с) на процессоре Apple M1.
- Исходный код и документация: GitHub ekhidirov/hermitmq
- Стек и технологии: Go (Golang), Custom Binary TCP Protocol, Write Ahead Log, Memory Mapped Files, Zero Copy I/O, Built in Client SDK.
Почему стандартные брокеры становятся узким местом?
В высоконагруженных микросервисных архитектурах классические брокеры сообщений часто упираются в три ограничения: оверхед на сериализацию/десериализацию (JSON/Protobuf), паузы сборщика мусора из за постоянных аллокаций памяти в куче и блокировки потоков при конкурентной записи в одну очередь. Цель разработки HermitMQ заключалась в создании предельно быстрого, предсказуемого по памяти брокера на чистом Go с минимальным временем отклика.
Ключевые архитектурные решения HermitMQ
| Узел системы | Реализация в HermitMQ | Что это даёт бизнесу и инфраструктуре |
| Сетевой протокол | Кастомный 29 байтный бинарный протокол поверх TCP без внешних сериализаторов | Минимальный сетевой оверхед, отсутствие лишних аллокаций памяти при парсинге заголовков |
| Хранение данных | Модель Topic Partition на базе Write Ahead Log с mmap-индексированными файлами | Мгновенный поиск смещений (offset) через отображение индекса в память и последовательная запись на диск |
| Сетевой ввод-вывод | Потоковая передача Zero Copy через io.CopyN | Передача данных из файлового буфера в сокет в обход пользовательского пространства памяти, скорость чтения до 3.4 ГБ/с |
| Управление конкурентностью | Паттерн Lock Striping (разделение блокировок по партициям и сегментам) | Устранение contention на глобальных мьютексах при одновременной работе десятков продюсеров и консьюмеров |
| Отказоустойчивость | Встроенная защита от OOM и контроль размера фреймов | Стабильная работа под пиковым трафиком без внезапного падения ноды из за переполнения ОЗУ |
Бенчмарки
Тестирование проводилось на локальном стенде (Apple Silicon M1) с использованием встроенного в проект Client SDK:
- Пропускная способность при чтении (Zero Copy Read): более 2 000 000 сообщений в секунду.
- Полоса пропускания данных: свыше 3.4 ГБ/с.
- Потребление памяти: плоский профиль использования RAM и минимальное давление на Go Garbage Collector благодаря zero allocation подходу на критическом пути.