如何在ZeroMQ中接收N个订户中的1个的错过消息?

时间:2012-06-20 12:27:28

标签: python zeromq

我想在Python应用程序中使用AMPQ服务,但没有使用ZeroMQ。所以我想知道是否可以这样做:

  • receiver1.py和receiver2.py从一个主机订阅'common_messages'&端口
  • receiver2.py崩溃
  • 发件人发送邮件
  • receiver1.py成功收到它
  • receiver2.py重新启动
  • receiver2.py接收缺席时发送的消息

可以这样做吗? ZeroMQ是否跟踪已发送的消息?如果在发送消息后进行订阅,ZMQ是否会检测应该接收哪些旧消息以及哪些不应该接收?

2 个答案:

答案 0 :(得分:3)

如果您正在使用PUB-SUB连接(看起来好像在描述),那么快速回答是否定的。发布socket会丢弃邮件而不是排队。

即使您将套接字类型更改为PUSH和PULL,您仍然会遇到问题。是的,PUSH套接字将阻止未收到的消息,但由于您将连接另一个客户端,因此将发送该消息,因此如果其中一个客户端丢弃,则不会阻止该消息。使用PUSH-PULL类型,您无法“订阅”某些消息,因为您可以使用PUB-SUB连接。

您可以实现一些逻辑来执行您所描述的内容。结帐zmq的guide(第二项目项目),了解他们为可靠连接“推荐”的内容。描述的内容本质上是一种跟踪客户端接收哪些消息(递增id?)的方法,以及客户端可以“请求重新发送错过的消息”的第二种连接。


上面的部分也可以通过客户端实现服务器'heartbeat',它会给出收到的最后一条消息。服务器检查这一点以确保客户端不在后面并重新发布消息(如果是。)

答案 1 :(得分:3)

g19fanatic has already answered your question.

再加上他的回答:

ZeroMq提供超级套接字。使用它的关键优势在于,一旦识别出通信模式,就很容易使用它。你不必担心

  1. 阅读与普通套接字不同的整个消息
  2. 您不必担心套接字的创建和细节与普通套接字相同
  3. 与普通套接字不同,zeromq套接字可以连接到多个zeromq套接字。这是非常有利的。
  4. 但是,ZeroMq无法解决消息持久性问题。 (ZeroMQ代表零消息队列)。像AMQP实现的消息队列提供消息排队和传递保证。它存储消息直到它被传递。为实现这一目标,它使用了更复杂的协议(AMQP)。 ZeroMQ仅提供消息传递模式。

    它允许您在其上实现任何协议,持久性或其他属性。

    1. 有些人喜欢在ZeroMQ客户端上使用AMQP基础设施。

      请参阅RabbitMq plugin to use ZeroMQ as client

      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