EagleMQ — новый высокопроизводительный менеджер очередей.
Основные решаемые задачи — эффективное распределение сообщений между процессами, межпроцессорное взаимодействие и уведомления в режиме реального времени.
Для решения базовых задач есть 3 основных примитива: очереди, маршруты и каналы.
Очереди Очереди — самый важный примитив.
Очереди позволяют хранить сообщения и выдавать их клиенту в том же порядке, в котором они поступили (принцип FIFO).
Каждая очередь должна быть объявлена перед использованием.
Если очередь не объявлена, то весь набор команд при работе с ней будет недоступен.
Декларация позволяет отслеживать использование очереди клиентами и автоматически удалять ее, если она никем не используется и при создании очереди был указан флаг AUTODELTE. Сообщения могут иметь гарантированную доставку.
Чтобы использовать гарантированную доставку, при получении сообщения из очереди с помощью команды .
queue_pop необходимо указать время ожидания возврата, отличное от нуля (в миллисекундах).
Затем, когда сообщение будет получено, подтвердите доставку с помощью команды .
queue_confirm (используя уникальный идентификатор сообщения).
Если доставка не будет подтверждена в течение указанного времени, сообщение будет возвращено в очередь как самое старое сообщение и отправлено следующему клиенту как можно скорее.
Также сообщения могут иметь ограниченный срок хранения (срок годности) и будут автоматически удаляться по истечении срока.
Срок хранения — это атрибут сообщения, отправленного в очередь.
Очереди поддерживают асинхронную доставку входящих сообщений клиентам.
Чтобы использовать асинхронную доставку, необходимо подписаться на очередь командой .
queue_subscribe, указав во флагах режим подписки.
Очереди имеют 2 режима подписки: сообщение и уведомление.
В режиме сообщений клиентам отправляется событие, содержащее имя очереди, в которую поступило сообщение, и само сообщение.
В этом случае сообщение не попадает в очередь, поскольку оно уже отправлено клиентам.
Если очередь создана с флагом ROUND_ROBIN, сообщение будет отправлено только одному клиенту за раз, а не всем.
Алгоритм циклического перебора используется для распространения сообщений клиентам.
В режиме уведомления всем клиентам, подписавшимся на очередь в этом режиме, отправляется сообщение, содержащее только имя очереди.
Это событие будет отправлено всем подписчикам очереди в этом режиме, даже если сообщение было отправлено кому-то и не попало в очередь.
Вы можете отказаться от асинхронной доставки сообщений с помощью команды .
queue_unsubscribe. При создании очереди вы указываете имя очереди, максимальное количество сообщений, которые можно сохранить, максимальный размер сообщения и флаги.
Максимальное количество сообщений позволяет остановить попадание новых сообщений в очередь при достижении лимита.
Максимальный размер сообщения позволяет предотвратить отправку сообщений большего размера.
Этот параметр не может иметь значение больше 2147483647. Очередь поддерживает 4 флага: AUTODELETE, FORCE_PUSH, ROUND_ROBIN, DURABLE. Флаг AUTODELETE используется для автоматического удаления очереди, если она никем не объявлена и не имеет подписчиков.
Флаг FORCE_PUSH позволяет отправлять сообщения в очередь при достижении максимального количества сообщений.
Это достигается путем удаления старого сообщения, чтобы сохранить новое.
Флаг ROUND_ROBIN позволяет отправлять сообщение одновременно только одному подписчику (см.
описание выше).
Флаг DURABLE указывает, что очередь является постоянной и может храниться вместе со всеми сообщениями в хранилище.
Список команд для работы с очередями:
- .
queue_create(имя, max_msg, max_msg_size, флаги)
- .
queue_declare(имя)
- .
queue_exist(имя)
- .
queue_list
- .
queue_rename(от, до)
- .
queue_size(имя)
- .
queue_push(имя, сообщение)
- .
queue_get(имя)
- .
queue_pop(имя, тайм-аут)
- .
queue_confirm(имя, тег)
- .
queue_subscribe(имя, флаги)
- .
queue_unsubscribe(имя)
- .
queue_purge(имя)
- .
queue_delete(имя)
Маршруты позволяют связать очереди с определенным ключом и организовать быструю и эффективную доставку сообщений.
Чтобы привязать очередь к ключу, используйте команду .
route_bind. Команда .
route_push отвечает за отправку сообщения по маршруту.
Если при отправке сообщения по маршруту с использованием ключа было подключено несколько очередей, то сообщение не копируется (счетчик обращений), что ускоряет выполнение команды и снижает потребление памяти сервером.
Маршрут поддерживает 3 флага: AUTODELETE, ROUND_ROBIN, DURABLE. Флаг AUTODELETE используется для автоматического удаления маршрута, если он не имеет связей с очередями по ключу.
Флаг ROUND_ROBIN позволяет при получении сообщения по маршруту отправить сообщение только в одну очередь, соединенную ключом.
Для распределения сообщений по очередям используется циклический алгоритм.
Флаг DURABLE указывает, что маршрут является постоянным и может храниться вместе со всеми ключами в хранилище.
Список команд для работы с маршрутами:
- .
route_create(имя, флаги)
- .
route_exist(имя)
- .
route_list
- .
route_keys(имя)
- .
route_rename(от, куда)
- .
route_bind(имя, очередь, ключ)
- .
route_unbind(имя, очередь, ключ)
- .
route_push(имя, ключ, сообщение)
- .
route_delete(имя)
Принцип работы заключается в том, что клиент может подписаться на определенную тему с помощью команды .
channel_subscribe. Когда сообщение отправляется в канал другим клиентом с помощью команды .
channel_publish по данной теме, событие с сообщением будет отправлено клиенту, подписавшемуся на эту тему.
Вы также можете подписаться на тематическую группу, используя шаблон, используя команду .
channel_psubscribe. Формат шаблона — шаблон в стиле glob. Канал поддерживает 3 флага: AUTODELETE, ROUND_ROBIN, DURABLE. Флаг AUTODELETE используется для автоматического удаления канала, если на нем нет подписчиков.
Флаг ROUND_ROBIN позволяет отправить сообщение только одному из многих подписчиков.
Для распределения сообщений между подписчиками используется циклический алгоритм.
Флаг DURABLE указывает, что канал является постоянным и может храниться в хранилище.
Список команд для работы с каналами:
- .
channel_create(имя, флаги)
- .
channel_exist(имя)
- .
channel_list
- .
channel_rename(от, до)
- .
channel_publish(имя, тема, сообщение)
- .
channel_subscribe(имя, тема)
- .
channel_psubscribe(имя, шаблон)
- .
channel_unsubscribe(имя, тема)
- .
channel_punsubscribe(имя, шаблон)
- .
channel_delete(имя)
disconnect. EagleMQ может иметь несколько пользователей, и каждый пользователь может иметь свой собственный набор прав.
Права пользователя легко настраиваются.
Вы можете отключить любую команду (кроме .
disconnect) и, следовательно, любой примитив.
Это может быть полезно во многих случаях.
Например, вы используете сервер в качестве очереди задач и у вас есть множество клиентов, которые создают задачи, а также множество клиентов, которые их обрабатывают. В этом случае клиентам, создающим задачи, рекомендуется разрешить использование только команды .
queue_push. Обработчики клиентов будут иметь права только на команду .
queue_pop. Это поможет сохранить данные и четко определить роль клиента в системе.
Это также может быть полезно, если вы установили сервер во внешней сети (например, публичную рассылку предупреждений о землетрясениях в режиме реального времени) и разрешили любому пользователю подключаться напрямую (в этом случае у пользователя достаточно прав на .
channel_subscribe и .
канал_psubscribe).
Список команд для работы с пользователями:
- .
user_create(имя, пароль, разрешение)
- .
user_list
- .
user_rename(от, до)
- .
user_set_perm(имя, разрешение)
- .
user_delete(имя)
Список всех команд есть в документации.
Производительность EagleMQ имеет довольно высокую производительность.
Строгие комплексные измерения и сравнительные испытания еще не проводились.
Во многом это связано с тем, что некоторые подобные системы имеют возможность тонкой настройки задачи (например, RabbitMQ) и мой опыт работы в этих системах не позволяет мне оценить ее объективно.
В отличие от других систем, EagleMQ практически не требует дополнительной настройки, влияющей на производительность.
Также очень мала вероятность ошибиться при выборе примитива или его неправильном использовании.
Для тестирования мы использовали утилиту эталонного тестирования из libemq. Суть тестирования заключается в отправке сообщений в очередь командой .
queue_push. Приложение использует 50 потоков.
Для подключения к серверу использовались локальные TCP-сокеты.
Процессор Intel Core(TM) i5-2450M @ 2,50 ГГц
Клиенты | Всего сообщений | Размер сообщения | Время, секунды | Рек/сек |
---|---|---|---|---|
50 | 1 000 000 | 1000 | 9.20 | 108283.71 |
50 | 1 000 000 | 100 | 8.07 | 123931.09 |
50 | 1 000 000 | 10 | 8.05 | 124300.80 |
50 | 100 000 | 1000 | 0.95 | 105596.62 |
50 | 100 000 | 100 | 0.85 | 117096.02 |
50 | 100 000 | 10 | 0.81 | 123304.56 |
Клиенты | Всего сообщений | Размер сообщения | Время, секунды | Рек/сек |
---|---|---|---|---|
50 | 1 000 000 | 1000 | 5.19 | 192566.92 |
50 | 1 000 000 | 100 | 4.47 | 223613.59 |
50 | 1 000 000 | 10 | 4.40 | 227169.47 |
50 | 100 000 | 1000 | 0.53 | 189393.94 |
50 | 100 000 | 100 | 0.46 | 219298.25 |
50 | 100 000 | 10 | 0.45 | 220750.55 |
Обычно для поддержки этой функциональности примитив должен быть создан с флагом DURABLE. Также в файле конфигурации необходимо указать путь к хранилищу и указать интервал хранения.
Все данные постоянно хранятся в оперативной памяти.
Принцип работы механизма сохранения заключается в клонировании процесса (форке) через заданный интервал и записи всех необходимых данных в файл.
Для сохранения данных по запросу клиента существует команда .
save. Все хранимые данные по возможности сжимаются с использованием библиотеки liblzf. Протокол EagleMQ имеет собственный двоичный протокол.
В таких системах почти всегда используются бинарные протоколы (AMQP, ZMQ) и помогают добиться высокой производительности при обработке запроса.
Есть, конечно, и недостатки:
- Бинарный протокол не читается человеком.
- Могут возникнуть трудности при реализации клиентских библиотек на скриптовых языках программирования.
- Необходимость использования совместимого клиента, т.к.
двоичный протокол может измениться.
Дорожная карта
- Улучшена поддержка агрегации пакетов, позволяющая отправлять несколько команд одновременно.
Сейчас такая поддержка уже есть, но с потерей пакетов.
- Документирование двоичного протокола.
- Написание CLI для управления EagleMQ с помощью командной строки.
- Разработка и обслуживание веб-сайта www.eaglemq.com .
- Поддержка малых и больших английских архитектур.
- Покрываем весь функционал тестами.
Буду рад ответить.
Репозиторий проекта: GitHub Теги: #eaglemq #очередь #сообщение #реальное время #разработка сайтов
-
Немного О Развитии Онлайн-Общения
19 Oct, 24 -
Вы Верите В Бога Надежности?
19 Oct, 24 -
Хабра В Финале!
19 Oct, 24