Публикация / подписка надежные сообщения: Redis VS RabbitMQ

фон

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

издатель и потребитель находятся на разных компьютерах и связь между ними может иногда ломаться.

цель

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

порядок сообщений не является обязательным.

согласно моим исследованиям, RabbitMQ является правильным выбором для этого сценария:

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

С другой стороны, Redis также способен сделать это:

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

вопросы

  1. для этого случая использования, какое решение было бы проще всего реализовать? (Решение Redis или решение RabbitMQ?)
  2. пожалуйста, предоставьте ссылку на пример с тем, что вы считаете лучшим!

3 ответов


фон

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

это в теории, не совсем подходит для публикации и подписки:

  • этот шаблон не заботится о том, получены ли сообщения или нет. Издатель просто рассылает сообщения, и если есть какие-либо подписчики, слушающие, хорошо, иначе ему все равно.

действительно, глядя на мои потребности мне нужно больше работать очередь , или даже шаблон RPC.

анализ

люди говорят, что оба должны быть легкими, но это действительно субъективно.

RabbitMQ имеет лучшую официальную документацию в целом с четкими примерами на большинстве языков, в то время как информация Redis в основном находится в сторонних блогах и в редких репозиториях github, что значительно затрудняет ее поиск.

Что касается примеров, RabbitMQ имеет два примера, которые четко отвечают на мой вопросы:

смешивая два, я смог заставить издателя отправлять нескольким потребителям надежные сообщения-даже если один из них терпит неудачу. Сообщения не теряются и не забываются.

падение rabbitMQ:

  • самая большая проблема этого подхода заключается в том, что если потребитель / работник падает, вам нужно определить логику самостоятельно, чтобы убедиться, что задачи не теряются. Это происходит потому, что после завершения задачи, следуя шаблону RPC с длительными очередями из рабочих очередей, сервер будет продолжать отправлять сообщения работнику, пока он не вернется снова. Но работник не знает, прочитал ли он уже ответ с сервера или нет, поэтому потребуется несколько ACK с сервера. Чтобы исправить это, каждое рабочее сообщение должно иметь идентификатор, который вы сохраняете на диске (в случае сбоя) или запросы должны быть идемпотентными.
  • другая проблема заключается в том, что если соединение потеряно, клиенты взрываются с ошибками, поскольку они не могут подключиться. Это также то, что вы должны подготовить заранее.

что касается redis, у него есть хороший пример длительных очередей в этом блоге:

после официальной рекомендация. Вы можете проверить GitHub РЕПО для получения дополнительной информации.

падение Рэдис:

  • как и с rabbitmq, вам также нужно обрабатывать рабочие сбои самостоятельно, иначе выполняемые задачи будут потеряны.
  • вы должны сделать опрос. Каждый потребитель должен спрашивать производителя, есть ли какие-либо новости, каждые X секунд.

это, на мой взгляд, худший кролик.

вывод

Я в конечном итоге иду с rabbitmq для следующие причины:

  1. более надежная официальная онлайн-документация с примерами.
  2. нет необходимости для потребителей, чтобы опросить производителя.
  3. обработка ошибок так же просто, как в redis.

имея это в виду, для этого конкретного случая я уверен, что redis является худшим rabbitmq в этом сценарии.

надеюсь, что это помогает.


Что касается реализации, они оба должны быть простыми - у них есть библиотеки на разных языках, проверьте здесь redis и здесь в RabbitMQ. Я просто буду честен здесь: я не использую javascript, поэтому я не знаю, как реализованы или поддерживаются уважаемые библиотеки.

относительно того, что вы не нашли в учебнике (или, возможно, пропустили во втором где есть несколько слов о длительных очередях и постоянных сообщениях и признавая сообщения) есть некоторые хорошо объясненные вещи:

издатель подтверждает, что действительно нет в учебнике, но есть пример на github в amqp.РЕПО узла.

с кроликом mq сообщение путешествует (в большинстве случаев), как это
publisher -> exchange -> queue -> consumer
и на каждой из этих остановок есть какая-то настойчивость, которая должна быть достигнута. Кроме того, если вы доберетесь до кластеров и зеркального отображения очередей, вы достигнете еще большей надежности (и доступности, конечно).


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

есть несколько имен, таких как disque, bull, kue, amqplib и т. д...

документация для них довольно хороша. Вы можете просто скопировать и вставить и запустить его за несколько минут.

Я использую seneca и seneca amqp-довольно хороший пример

https://github.com/senecajs/seneca-amqp-transport