Сравнение производительности между ZeroMQ, RabbitMQ и Apache Qpid

Мне нужна высокопроизводительная шина сообщений для моего приложения, поэтому я оцениваю производительность ZeroMQ, RabbitMQ и Apache Qpid. Чтобы измерить производительность, я запускаю тестовую программу, которая издает 10 000 сообщений с использованием одной из реализаций очереди сообщений и запускает другой процесс на том же компьютере, чтобы потреблять эти 10 000 сообщений. Затем я записываю разницу во времени между первым опубликованным сообщением и последним полученным сообщением.

Ниже приведены настройки, которые я использовал для сравнения.

  • RabbitMQ: Я использовал обмен типа "разветвление" и очередь с настройкой по умолчанию. Я использовал клиентскую библиотеку RabbitMQ C.
  • ZeroMQ: Мой издатель публикует tcp://localhost:port1 с ZMQ_PUSH сокетом. Мой брокер слушает tcp://localhost:port1 и отправляет сообщение в tcp://localhost: port2, а мой потребитель прослушивает tcp://localhost:port2, используя ZMQ_PULL сокет. Я использую брокера вместо одноранговой связи для обмена сообщениями в ZeroMQ, чтобы сделать сравнение производительности честным с другой реализацией очереди сообщений, которая использует брокеров.
  • Qpid Брокер сообщений на языке С++: я использовал обмен типа "разветвление" и очередь с настройкой по умолчанию. Я использовал клиентскую библиотеку Qpid С++.

Ниже приведен результат производительности:

  • RabbitMQ: для получения 10 000 сообщений требуется около 1 секунды.
  • ZeroMQ: для получения 10000 сообщений требуется около 15 миллисекунд.
  • Qpid: для приема 10000 сообщений требуется около 4 секунд.

Вопросы:

  • Есть ли у кого-нибудь аналогичное сравнение производительности между очередями сообщений? Затем мне нравится сравнивать мои результаты с вашими.
  • Есть ли способ настроить RabbitMQ или Qpid, чтобы улучшить производительность?

Примечание:

Тесты выполнялись на виртуальной машине с двумя выделенными процессорами. Результат может отличаться для разных аппаратных средств, однако меня в основном интересует относительная производительность продуктов MQ.

Ответ 1

RabbitMQ, вероятно, делает упор на эти сообщения. Я думаю, вам нужно установить приоритет сообщения или другой вариант в сообщениях, чтобы не выполнять упорство. Тогда производительность улучшится. Вы должны ожидать не менее 100 тыс. Сообщений в секунду через брокера AMQP. В OpenAMQ мы получили производительность до 300 тыс. Сообщений в секунду.

AMQP был разработан для скорости (например, он не распаковывает сообщения для их маршрутизации), но ZeroMQ просто лучше разработан по ключевым причинам. Например. он удаляет скачок путем соединения узлов без брокера; он улучшает асинхронный ввод-вывод, чем любой из пакетов клиента AMQP; он делает более агрессивную обработку сообщений. Возможно, 60% времени, проведенного в здании ZeroMQ, вошли в настройку производительности. Это была очень тяжелая работа. Это не быстрее.

Одна вещь, которую я хотел бы сделать, но я слишком занят, заключается в том, чтобы воссоздать AMKP-подобного брокера поверх ZeroMQ. Здесь есть первый слой: http://rfc.zeromq.org/spec:15. Весь стек будет работать как RestMS, транспорт и семантика разделяются на два слоя. Он будет обеспечивать те же функциональные возможности, что и AMQP/0.9.1 (и быть совместимым с семантикой), но значительно быстрее.

Ответ 2

Хм, конечно, ZeroMQ будет быстрее, он предназначен для того, чтобы быть и не иметь много брокерских функций, которые предоставляют другие два. сайт ZeroMQ имеет прекрасное сравнение брокерских и брокерских сообщений, недостатков и преимуществ обоих.

Блог RabbitMQ:

RabbitMQ и 0MQ фокусируются на разных аспектах обмена сообщениями. 0MQ уделяет гораздо больше внимания тому, как сообщения передаются по кабелю. С другой стороны, RabbitMQ фокусируется на том, как хранятся, фильтруются и контролируются сообщения.

(Мне также нравится вышеупомянутый пост RabbitMQ выше, поскольку он также говорит об использовании ZeroMQ с RabbitMQ)

Итак, я пытаюсь сказать, что вы должны принять решение о технологии, которая наилучшим образом соответствует вашим требованиям. Если единственным требованием является скорость, ZeroMQ. Но если вам нужны другие аспекты, такие как постоянство сообщений, фильтрация, мониторинг, переход на другой ресурс и т.д., Тогда, когда вам нужно начать рассмотрение RabbitMQ и Qpid.

Ответ 3

Я использую брокера вместо одноранговой связи для обмена сообщениями в ZeroMQ, чтобы сделать сравнение производительности честным с другой реализацией очереди сообщений, которая использует брокеров.

Не уверен, почему вы хотите это сделать - если вам нужно только то, что вам нужно, это производительность, нет необходимости создавать уровень игрового поля. Если вы не заботитесь о сохранении, фильтрации и т.д., То зачем платить цену?

Я также очень нахожусь под управлением тестов на виртуальной машине - есть много дополнительных слоев, которые могут повлиять на результаты способами, которые не очевидны. (Если вы, конечно, не планируете запускать реальную систему на виртуальных машинах, в этом случае это очень эффективный метод).

Ответ 4

Я тестировал С++/qpid

Я отправил 50000 сообщений в секунду между двумя разными машинами в течение длительного времени без очереди.

Я не использовал разветкитель, просто простой обмен (непостоянные сообщения)

Используете ли вы постоянные сообщения? Вы разбираете сообщения?

Я полагаю, что нет, поскольку у 0MQ нет структур сообщений.

Если брокер в основном не работает, вероятно, вы не настроили предварительную выборку на отправителя и рецептора. Это очень важно для отправки многих сообщений.

Ответ 5

Мы сравнили RabbitMQ с нашей SocketPro (http://www.udaparts.com/) постоянную очередь сообщений на сайте http://www.udaparts.com/document/articles/fastsocketpro.htm со всеми исходными кодами. Вот результаты, полученные нами для RabbitMQ:

Остановка и удаление очереди в одном компьютере:

"Привет мир" -
Enqueue: 30000 сообщений в секунду,
Dequeue: 7000 сообщений в секунду.

Текст с 1024 байтами -
Enqueue: 11000 сообщений в секунду,
Dequeue: 7000 сообщений в секунду.

Текст с 10 * 1024 байтами -
Enqueue: 4000 сообщений в секунду,
Dequeue: 4000 сообщений в секунду.

Взаимосвязь между машинами и удаление очереди с пропускной способностью сети 100 Мбит/с:

"Привет мир" -
Enqueue: 28000 сообщений в секунду,
Dequeue: 1900 сообщений в секунду.

Текст с 1024 байтами -
Enqueue: 8000 сообщений в секунду;
Dequeue: 1000 сообщений в секунду.

Текст с 10 * 1024 байтами -
Enqueue: 800 сообщений в секунду,
Dequeue: 700 сообщений в секунду.

Ответ 6

Попробуйте настроить предварительную выборку для отправителя и рецептора со значением 100. Предварительная выборка только отправителя недостаточно.

Ответ 7

Мы разработали шину сообщений с открытым исходным кодом, построенную поверх ZeroMQ - мы изначально сделали это, чтобы заменить Qpid. Это брокерский, так что это абсолютно справедливое сравнение, но оно обеспечивает ту же функциональность, что и посреднические решения.

Наш показатель производительности заголовка составляет 140 тыс. msgs в секунду между двумя машинами, но здесь вы можете увидеть более подробно: https://github.com/Abc-Arbitrage/Zebus/wiki/Performance

Ответ 8

Я думаю, что если вы используете сельдерей, производительность Rabbitmq улучшится