8

我正在使用 ZeroMQ 来促进我需要的发布/订阅环境。我正在使用 Python(使用 EventLoop)在机器 A 上运行发布服务器,现在我有一个在机器 B 上以 C++ 运行的订阅者和在机器 C 上以 Python(使用 EventLoop)运行的第二个订阅者。

如果机器 B 在机器 C 之前订阅了机器 A,那么 B 会收到订阅的消息,而 C 不会。此外,如果我查看机器 A 上已建立的连接,则只存在机器 B 的连接,而不存在机器 C 的连接。如果机器 C 在 B 之前订阅了 A,那么情况正好相反。

这是我的发布者代码:

import zmq
from zmq.eventloop import ioloop, zmqstream

ioloop.install()

context   = zmq.Context(1)
socket    = context.socket(zmq.PUB)
publisher = zmqstream.ZMQStream(socket)
socket.bind("tcp://*:1337")

def publish():
  publisher.send_multipart(("heartbeat", "OHAI"))

ioloop.PeriodicCallback(publish, 5000).start()
ioloop.IOLoop.instance().start()

这是我的 Python 订阅者代码:

import zmq
from zmq.eventloop import ioloop, zmqstream

ioloop.install()

context    = zmq.Context(1)
socket     = context.socket(zmq.SUB)
subscriber = zmqstream.ZMQStream(socket)
socket.setsockopt(zmq.SUBSCRIBE, "heartbeat")
socket.connect("tcp://pub.local:1337")

def subscription(message):
  print "Message Received: %s" % (message[1])

subscriber.on_recv(subscription)
ioloop.IOLoop.instance().start()

为什么我的发布者不接受多个传入订阅者套接字?可能值得注意的是,多个订阅者在机器 A 上运行它们时工作正常,但我认为这不是防火墙问题,因为我在禁用防火墙的情况下测试了从 B 和 C 到 A 的订阅者连接。

4

1 回答 1

5

感谢大家在原始帖子中提供的所有有用的评论。事实证明,这种行为是由于所使用的 ZeroMQ 版本不匹配造成的……这是我的疏忽。

于 2012-10-25T17:16:51.373 回答