Как получать пропущенные сообщения для 1 из N подписчиков в ZeroMQ?

Я хочу использовать службу AMPQ в приложениях Python, но не работал с ZeroMQ. Поэтому я хочу знать, можно ли это сделать:

  • Receiver1.py и Receiver2.py подписываются на «common_messages» с одного хоста и порта.
  • Receiver2.py аварийно завершает работу
  • отправитель отправляет сообщение
  • Receiver1.py успешно получает его
  • Receiver2.py перезапускается
  • Receiver2.py получает сообщение, которое было отправлено, пока оно отсутствовало.

Можно ли это сделать? Отслеживает ли ZeroMQ, какие сообщения были отправлены? Если кто-то подписывается после того, как сообщения были отправлены, определяет ли ZMQ, какие старые сообщения следует получать, а какие нет?


person culebrón    schedule 20.06.2012    source источник


Ответы (2)


Если вы используете соединение PUB-SUB (которое, похоже, вы описываете), то быстрый ответ — нет. Публикующий сокет отбрасывает сообщения, а не ставит их в очередь.

Даже если вы измените типы сокетов на PUSH и PULL, у вас все равно будут проблемы. Да, сокет PUSH будет блокироваться для неполученных сообщений, но поскольку у вас будет подключен другой клиент, сообщение будет отправлено и, следовательно, не будет заблокировано, если один из клиентов упадет. С типами PUSH-PULL вы не можете «подписываться» на определенные сообщения, как вы можете это делать с соединениями PUB-SUB.

Вы можете реализовать некоторую логику, чтобы делать то, что вы описываете. Ознакомьтесь с руководством zmq (второй пункт списка), чтобы узнать, что они "рекомендуют" для надежное соединение. То, что описывается, - это, по сути, метод отслеживания того, какие сообщения получает клиент (увеличение идентификатора?), И второе соединение, которое клиент может затем «запросить повторную отправку пропущенных сообщений».


Вышеупомянутый раздел также может быть реализован с «пульсом» от клиента к серверу, который выдает последнее полученное сообщение. Сервер проверяет это, чтобы убедиться, что клиент не отстает, и повторно публикует сообщения, если это так.

person g19fanatic    schedule 20.06.2012

g19fanatic has already answered your question.

Дополнение к его ответу:

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

  1. Чтение целых сообщений в отличие от обычных сокетов
  2. Вы не беспокоитесь о создании сокета и деталях так же, как и обычные сокеты.
  3. В отличие от обычных сокетов, сокет zeromq может подключаться к нескольким сокетам zeromq. Это очень выгодно.

Однако ZeroMq не решает проблему сохраняемости сообщений. (ZeroMQ означает нулевую очередь сообщений). Очереди сообщений, такие как реализации AMQP, обеспечивают организацию очереди сообщений и гарантию доставки. Он хранит сообщение до тех пор, пока оно не будет доставлено. Для этого используется более сложный протокол (AMQP). ZeroMQ предоставляет только шаблоны обмена сообщениями.

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

  1. Некоторым нравится использовать инфраструктуру AMQP с клиентом ZeroMQ.

    См. плагин RabbitMq для использования ZeroMQ в качестве клиента.

    https://serverfault.com/questions/80679/how-to-pick-between-rabbitmq-and-zeromq-or-something-else

  2. Другое решение — использовать Redis Pub/Sub: http://redis.io/topics/pubsub

  3. Другие сочетают это. https://github.com/pete0emerson/commander
person pyfunc    schedule 20.06.2012