4

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

  • receiver1.py 和 receiver2.py 从一个主机和端口订阅“common_messages”
  • receiver2.py 崩溃
  • 发件人发送消息
  • receiver1.py 成功接收
  • receiver2.py 重新启动
  • receiver2.py 接收在它不存在时发送的消息

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

4

2 回答 2

3

如果您使用的是 PUB-SUB 连接(看起来好像您在描述),那么快速回答是否定的。发布套接字丢弃消息而不是将它们排队。

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

您可以实现一些逻辑来执行您所描述的操作。查看 zmq 的指南(第二个项目符号)以查看他们为可靠连接“推荐”的内容。所描述的本质上是一种跟踪客户端接收到哪些消息(递增 id?)的方法以及客户端可以“请求重新发送丢失的消息”的第二个连接。


上面的部分也可以通过客户端到服务器的“心跳”来实现,它给出了它收到的最后一条消息。服务器对此进行检查以确保客户端没有落后,如果是,则重新发布消息。

于 2012-06-20T16:46:06.367 回答
3

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
于 2012-06-20T17:47:30.983 回答