你能在 ZeroMQ 中创建一个集中的主题吗?
Can you create a centralized topic in ZeroMQ?
我真的很想尝试 ZeroMQ,我想知道我的问题是否可以用它来解决。
问题:我有多个订阅者和多个发布者。在集中式代理架构中,发布者将向主题(有点像多播地址)发布消息,订阅者将从主题获取消息并对消息采取行动。我无法使用多播,因为我们的网络拓扑有多个子网,IT 人员不会将我的多播数据包转发到所有子网。
既然没有中心化broker,那么ZeroMQ如何解决这个问题呢? (示例代码在任何语言中都很棒)
这是一个非常简单的问题,但我会尝试为您提供一些指导...请理解您没有描述实际问题,只是一个有多种潜在解决方案的用例,具体取决于您的特殊需求。
在最基本的层面上,您可以让每个订阅者维护每个发布者的列表,并直接订阅每个发布者。这都是非常蛮力和手动的,但这是完成您想要的事情的第一步。
如果维护该列表成为每个节点的棘手问题,您可以创建一个新节点来为您管理订阅者列表。当发布者启动时,它会向管理器节点发出关于自身的通知,管理器节点会通知订阅者他们需要订阅它。
如果我们谈论的是真正大量的发布者和订阅者,并且完整的网络拓扑需要解决问题,您可以编写自己的代理来订阅每个发布者,然后重新发布给所有订阅者。
这些解决方案中的每一个都存在细微差别,但在高层次上,这是您的三个基本选择。如果您对哪种方式最适合您的情况有所了解并且需要进一步的指导,请添加更多详细信息,我们可以详细说明。
正在阅读。毕竟这在 ZeroMQ 中是可能的。您可以将 "FORWARDER" 设备用作:
import zmq
def main():
try:
context = zmq.Context(1)
# Socket facing clients
frontend = context.socket(zmq.SUB)
frontend.bind("tcp://*:5559")
frontend.setsockopt(zmq.SUBSCRIBE, "")
# Socket facing services
backend = context.socket(zmq.PUB)
backend.bind("tcp://*:5560")
zmq.device(zmq.FORWARDER, frontend, backend)
except Exception, e:
print e
print "bringing down zmq device"
finally:
pass
frontend.close()
backend.close()
context.term()
if __name__ == "__main__":
main()
我真的很想尝试 ZeroMQ,我想知道我的问题是否可以用它来解决。
问题:我有多个订阅者和多个发布者。在集中式代理架构中,发布者将向主题(有点像多播地址)发布消息,订阅者将从主题获取消息并对消息采取行动。我无法使用多播,因为我们的网络拓扑有多个子网,IT 人员不会将我的多播数据包转发到所有子网。
既然没有中心化broker,那么ZeroMQ如何解决这个问题呢? (示例代码在任何语言中都很棒)
这是一个非常简单的问题,但我会尝试为您提供一些指导...请理解您没有描述实际问题,只是一个有多种潜在解决方案的用例,具体取决于您的特殊需求。
在最基本的层面上,您可以让每个订阅者维护每个发布者的列表,并直接订阅每个发布者。这都是非常蛮力和手动的,但这是完成您想要的事情的第一步。
如果维护该列表成为每个节点的棘手问题,您可以创建一个新节点来为您管理订阅者列表。当发布者启动时,它会向管理器节点发出关于自身的通知,管理器节点会通知订阅者他们需要订阅它。
如果我们谈论的是真正大量的发布者和订阅者,并且完整的网络拓扑需要解决问题,您可以编写自己的代理来订阅每个发布者,然后重新发布给所有订阅者。
这些解决方案中的每一个都存在细微差别,但在高层次上,这是您的三个基本选择。如果您对哪种方式最适合您的情况有所了解并且需要进一步的指导,请添加更多详细信息,我们可以详细说明。
正在阅读。毕竟这在 ZeroMQ 中是可能的。您可以将 "FORWARDER" 设备用作:
import zmq
def main():
try:
context = zmq.Context(1)
# Socket facing clients
frontend = context.socket(zmq.SUB)
frontend.bind("tcp://*:5559")
frontend.setsockopt(zmq.SUBSCRIBE, "")
# Socket facing services
backend = context.socket(zmq.PUB)
backend.bind("tcp://*:5560")
zmq.device(zmq.FORWARDER, frontend, backend)
except Exception, e:
print e
print "bringing down zmq device"
finally:
pass
frontend.close()
backend.close()
context.term()
if __name__ == "__main__":
main()