0MQ PUB/SUB子系统的设计

本文深入探讨了PUB/SUB消息传输模式在0MQ环境中的核心设计原则,包括最小化网络流量、避免发送订阅者不感兴趣的消息以及确保消息传输效率。详细阐述了如何通过中间设备传递订阅信息,以及XPUB/XSUB socket在实现这一设计中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

PUB/SUB (publish/ subscrib)是一个用来给任意多个订阅者分发数据的消息传输模式。在0MQ的环境中,PUB/ SUB集中于可扩展性,即增加更多的订阅者到系统中去而不会使其过载的能力。

最小化网络流量

除了分发数据以外,PUB/ SUB子系统的另一个主要设计目的是最小化网络流量。毕竟,PUB/ SUB归结于因会使网络过载而臭名昭著的多播。因此,设计描述基于以下需求:

If there's no subscriber for a particular message in a specific portion of the distribution tree the data should not even traverse associated network segments.

虽然这个需求是不言而喻的,但是,它经常不被今天使用的消息传输系统所尊重。在大多数基于broker的系统中,订阅者使用broker订阅消息,然而,broker却没有办法去向发布者订阅消息。所以,即使没有客户对消息感兴趣,消息也会从发布者传输到broker,只是在broker处丢弃他们而已:

相反地,我们想要获得的东西是,一个系统中,假设如果一个消息没有一个人对其感兴趣,就要尽快得丢弃掉,即便在正在被往网络中发送:


我们也希望这个性质是可传递的,即,即使在发布者和订阅者之间有多个中间节点 (brokers, devices),不需要的信息仍然应该被尽快地丢弃掉:

更一般地,我们想要消息传输只通过消息分布树的这些格子,导向消费者感兴趣的消息:

此外,它将是更好的,如果传送消息通过图的任何边仅仅一次,即使有多个客户在在树的那个分支下面。换句话说,消息复制应该发生在顺着流尽可能远的位置——这种情况下,复制发生在节点D而不是节点P。

订阅转发

为了获得这种类型的设计,订阅必须被传送给上游节点,以使上游节点可以使用它们,避免发送订阅者不感兴趣的消息到路径中。这个属性应该是可传递的,即上游节点应该转发订阅到其父节点,以此方式依次传送给当前节点的父节点

所以,当客户应用程序订阅一个话题订阅,除了应用于本地,它还要向上游跳跃,知道它到达终极的生产者。

这种模型技术上的难点在于,如何通过中间设备传递订阅信息。回想一下,一个设备只是一对由用户代码连接起来的0mq socket。因此,没有方法可以实现设备的订阅转发而没有用户代码参与到这个过程。而这正是XPUB/ XSUB socket所做的事情。


XPUB和一个PUB socket类似,除了你可以从中接收消息以外



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值