dux*_*ux2 12 publish-subscribe zeromq message-bus
我正在测试ZeroMQ作为中型系统的Pub-Sub(服务总线式).我们有大约50个节点,所有节点都应该是发布者和订阅者.网络是一种星形拓扑,但边缘相互"交谈".我们需要动态发现(不需要硬编码参与者的网络地址),也没有SPOF(单点故障).
我已经阅读了http://zeromq.org/whitepapers:0mq-3-0-pubsub,据我所知,动态发现的建议0MQ方式涉及转发订阅和发布的代理节点(XPUB/XSUB).我考虑在我们的系统中使用这样的代理作为中央调解器,但是,我对这种架构有以下关注:(A)代理节点是SPOF - 当它失败时整个系统不起作用(B)所有流量,包括数据,通过代理节点,这意味着延迟和性能问题.
假设我正确理解了pub-sub白皮书,是否有一种相对简单的方法可以在ZeroMQ中实现pub-sub + dynamic-discovery + 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);
Run Code Online (Sandbox Code Playgroud)
如果代理节点出现故障,只需重新启动它; 重新连接/订阅应由zmq自动处理.
对于下游订户,将每个订户直接连接到所有可用代理:
subscriber = ctx.createSocket(ZMQ.SUB)
subscriber.connect( "tcp://proxy1:5555")
subscriber.connect( "tcp://proxy2:5555")
subscriber.connect( "tcp://proxy3:5555")
Run Code Online (Sandbox Code Playgroud)
发布者将比代理更频繁地出现,因此将订阅者直接连接到代理会导致较少的配置维护,因为代理的数量在很大程度上将是静态的.
如果代理节点发生故障,则上游LTM将流量路由到剩余的代理节点; 订阅者不会受到影响,因为他们使用所有可用的代理.
可以通过同步来寻址慢速用户,阅读此内容.在这里
查看订阅转发并最小化网络流量.

| 归档时间: |
|
| 查看次数: |
5377 次 |
| 最近记录: |