【问题标题】:How to receive missed messages for 1 of N subscribers in ZeroMQ?如何在 ZeroMQ 中接收 N 个订阅者中的 1 个的错过消息?
【发布时间】:2012-06-22 00:01:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: python zeromq


    【解决方案1】:

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

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

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


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

    【讨论】:

      【解决方案2】:

      g19fanatic has already answered your question.

      补充他的答案:

      ZeroMq 提供超级套接字。使用它的主要优点是,一旦您确定了一种通信模式,就很容易使用它。你不必担心

      1. 与普通套接字不同,读取整个消息
      2. 您不必像普通套接字一样担心套接字的创建和细节
      3. 与普通套接字不同,zeromq 套接字可以连接到多个 zeromq 套接字。这是非常有利的。

      然而,ZeroMq 并没有解决消息持久性的问题。 (ZeroMQ 代表零消息队列)。消息队列(如 AMQP 实现)提供消息队列和传递保证。它存储消息直到它被传递。为了实现这一点,它使用了更复杂的协议(AMQP)。 ZeroMQ 仅提供消息传递模式。

      它让您可以在它之上实现任何协议、持久性或其他属性。

      1. 有些人喜欢将 AMQP 基础架构与 ZeroMQ 客户端一起使用。

        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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多