Python 如何在ZeroMQ中为N个订阅服务器中的1个接收丢失的消息?

Python 如何在ZeroMQ中为N个订阅服务器中的1个接收丢失的消息?,python,zeromq,Python,Zeromq,我想在Python应用程序中使用AMPQ服务,但还没有使用ZeroMQ。所以我想知道这是否可以做到: receiver1.py和receiver2.py从一个主机和端口订阅“公共_消息” 破产管理人2.2 发送者发送消息 receiver1.py成功接收到它 receiver2.py已重新启动 receiver2.py接收不存在时发送的消息 这能做到吗?ZeroMQ是否跟踪已发送的消息?如果一个用户在消息发送后订阅,ZMQ是否检测到哪些旧消息应该接收,哪些不应该接收?如果您使用的是一个PUB

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

  • receiver1.py和receiver2.py从一个主机和端口订阅“公共_消息”
  • 破产管理人2.2
  • 发送者发送消息
  • receiver1.py成功接收到它
  • receiver2.py已重新启动
  • receiver2.py接收不存在时发送的消息

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

如果您使用的是一个PUB-SUB连接(似乎您正在描述),那么快速回答是否。发布会丢弃消息,而不是将消息排队

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

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



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

g19fananic已经回答了您的问题。

他补充说:

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

  • 与普通套接字不同,读取整个消息
  • 您不必像普通套接字那样担心套接字的创建和细节
  • 与普通套接字不同,zeromq套接字可以连接到多个zeromq套接字。这是非常有利的 然而,ZeroMq并不能解决消息持久性问题。(ZeroMQ代表零消息队列)。消息队列(如AMQP实现)提供消息队列和交付保证。它存储消息,直到消息被传递。为了实现这一点,它使用了更复杂的协议(AMQP)。ZeroMQ仅提供消息传递模式

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

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

  • 其他解决方案是使用Redis发布/订阅:

  • 其他人则将其结合起来