gpt4 book ai didi

ZeroMQ Pub-Sub + 无需中介器的动态发现

转载 作者:行者123 更新时间:2023-12-03 00:16:43 24 4
gpt4 key购买 nike

我正在测试 ZeroMQ 作为中型系统的 Pub-Sub(服务总线样式)基础设施。我们有大约 50 个节点,所有节点都应该是发布者和订阅者。该网络是一种星形拓扑,但边缘彼此“交谈”。我们需要动态发现(不需要对参与者的网络地址进行硬编码),但也不需要 SPOF(单点故障)。

我已阅读http://zeromq.org/whitepapers:0mq-3-0-pubsub据我了解,建议的动态发现 0MQ 方式涉及转发订阅和发布的代理节点(XPUB/XSUB)。我考虑过使用这样的代理作为我们系统中的中央中介,但是,我对此架构有以下担忧:(A) 代理节点是一个 SPOF - 当它发生故障时,整个系统将无法运行(B) 所有流量,包括数据,都经过代理节点,这意味着延迟和性能问题。

假设我正确理解了 pub-sub 白皮书,那么在 ZeroMQ 中是否有一种相对简单的方法来实现 pub-sub + 动态发现 + no-SPOF?

补充一点:我已经排除了多播 (PGM) 解决方案,因为大多数消息只有一个/几个感兴趣方,而且我们不喜欢网络过度拥挤。

最佳答案

单个发布者的多个订阅者不需要中介,因为订阅者可以直接与发布者交谈。但同时拥有多个发布者和订阅者就没那么容易了;除非中间有什么事情,否则维护将是一场噩梦,因为必须使用所有现有发布者来配置新订阅者。

您可以部署多个 XSUB/XPUB 代理,每个代理都在自己的计算机上,然后在发布者和代理之间部署负载平衡器(如 F5)。这样就实现了上游侧的负载均衡和容错。

代理代码很简单:

Socket frontend = context.socket(ZMQ.XSUB);
frontend.bind("tcp://proxy1:5444");
Socket backend = context.socket(ZMQ.XPUB);
backend.bind("tcp://proxy1:5555");
frontend.subscribe("".getBytes());
ZMQ.proxy (frontend, backend, null);

如果代理节点出现故障,只需重新启动即可;重新连接/订阅应该由 zmq 自动处理。

对于下游订阅者,将每个订阅者直接连接到所有可用代理:

subscriber = ctx.createSocket(ZMQ.SUB)
subscriber.connect( "tcp://proxy1:5555")
subscriber.connect( "tcp://proxy2:5555")
subscriber.connect( "tcp://proxy3:5555")

发布者比代理来得更频繁,因此将订阅者直接连接到代理会减少配置维护,因为代理的数量在很大程度上是静态的。

如果代理节点发生故障,上游 LTM 会相应地将流量路由到其余代理节点;订阅者不会受到影响,因为他们从所有可用代理进行消费。

缓慢的订阅者可以通过同步来解决,请阅读 this .
查看订阅转发和最小化网络流量 here .

enter image description here

关于ZeroMQ Pub-Sub + 无需中介器的动态发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18327865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com