嗨,我正在使用 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。
步骤:
您得到的结果是预期的,因为 PUB/SUB 不是一个可靠的协议。要调试您的问题,请按照此处的流程图进行操作。
如果没有帮助,我建议您在重新启动 VM 之前调用
context.destroy()
来正确终止 zmq 的上下文。
切换到 XPUB/XSUB 协议也可能对您的情况有所帮助。