ZMQ Pub/Sub 不支持发布者服务节点重置

问题描述 投票:0回答:1

嗨,我正在使用 ZMQ 和 pub/sub 模式。

我有一个单节点发布者和其他订阅者,我尝试使用 python (pyzmq) 和 c++ (cppzmq)

如果我启动publishear服务和订阅者servicio,这是可以的,但是如果我重新启动publishear节点并启动发布者服务,而不重新启动订阅者服务,则订阅者永远不会重新连接并且看不到消息。

如果我重新启动订阅服务就可以了,它会看到 zmq 消息。

我们嗅探端口中的流量,我们发现订阅者从未尝试重新连接,而发布者我认为等待新的订阅。

¿ZMQ 不支持在publishear 中重新启动,也许我的设置有问题?


重现问题的代码:

订阅者.py

import zmq
import sys

def subscriber():
    context = zmq.Context()
    socket = context.socket(zmq.SUB)
    socket.connect(sys.argv[1])

    # Suscribirse a todos los mensajes
    socket.setsockopt_string(zmq.SUBSCRIBE, '')

    while True:
        message = socket.recv_string()
        print(f"Received: {message}")

if __name__ == "__main__":
    subscriber()

python subscriber.py tcp://localhost:5555

一起跑步

publisher.py

import zmq
import time

def publisher():
    context = zmq.Context()
    socket = context.socket(zmq.PUB)
    socket.bind("tcp://*:5555")

    while True:
        message = "Hello, World!"
        socket.send_string(message)
        print(f"Sent: {message}")
        time.sleep(0.5) 

if __name__ == "__main__":
    publisher()

python publisher.py

一起跑步

注意:为了重现错误需要隔离发布者节点,我使用了虚拟机,但也许可以使用docker。

步骤:

  1. 启动订阅者
  2. 启动发布者
  3. 重新启动发布者虚拟机
  4. 启动发布者
  5. 我在订阅者中看不到新消息
zeromq pyzmq
1个回答
0
投票

您得到的结果是预期的,因为 PUB/SUB 不是一个可靠的协议。要调试您的问题,请按照此处的流程图进行操作。

如果没有帮助,我建议您在重新启动 VM 之前调用

context.destroy()
来正确终止 zmq 的上下文。

切换到 XPUB/XSUB 协议也可能对您的情况有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.