2

我一直在与qpid工作,现在我正在尝试移动到broker较少的消息系统,但我真的很困惑在Pub Sub模式中的网络流量。我读了以下文档: http://www.250bpm.com/pubsub#toc4 我真的很困惑如何实现订阅转发?酒吧子实施零mq 3.xx

我认为零mq必须是不可知的底层网络拓扑,但它似乎不是。每个节点如何知道要转发什么和不转发什么(例如:在eth网络中,可能有数百万用户和发布者,消息树对我来说听起来不太可行。那么甚至不知道关于零mq的存在,他们如何将数据包转发给连接到它们的订阅者,对于他们来说,它只是一个普通的数据包,所以即使它的数据包是同一个数据包,他们也只是转发多份数据包? 我不是网络专家可能是我缺少一些关于消息树的明显信息以及它是如何创建的? 请问您可以给出某些示例情况如何创建此分发树,以及确切创建哪些节点是xpub和xsub套接字?

是设备在链接中使用)就像一个经纪人,在整篇文章中它似乎是李ke设备就是任何一般中介跳,它不知道任何关于零mq套接字(只是一个随机网络跳),如果它确实是一个中介类的东西,这是否意味着pub sub,消息树中的所有节点必须满足作为设备的定义,因此它不是一个更少的设计?

另外在树形图中(来自链接,由P,D,C组成),我最初认为C和C是两个订户,而P是唯一的发布者(D只是随机跳跃),但现在看起来我们有D作为零mq。 C订阅D和D订阅P吗?或者C同时只订阅P(为了更通用,每个节点是否只订阅其父节点)。对于新手问题抱歉,但似乎我在这里显而易见的东西缺少,如果有人能够提供更多的见解,这将是很好的。

回答

1

zeromq使用网络直接(例如通过tcp)在节点之间建立连接,但只在1个发送者和1-n个接收者之间建立连接。这些“直接”连接并可以使用底层协议交换消息。

现在,当您仅订阅pub-sub方案中的某些事件时,zeromq用于过滤掉订阅方的消息,从发布方向至少一些订户造成不必要的网络流量。

在较新版本的zeromq(3.0和3.1)中,订阅者进程将其订阅列表发送给发布者,发布者管理订阅者列表以及他们感兴趣的主题。因此发布者可以丢弃未订阅的消息由任何订阅者并且可能仅向感兴趣的订户发送目标消息。

当发布者本身是事件的订阅者(例如转发或路由设备服务)时,它可以通过类似地订阅其连接的发布者来再次转发那些订阅。

我不确定zeromq是否仍然在新版本中进行客户端过滤,即使它“转发”了其订阅。

+0

因此,在消息传递树图中,中间设备实际上是订阅者的发布者?因此,对于像a-> b-> c这样的网络,其中a是唯一的发布者和b,c仅仅是同一主题的订阅者,消息将被发送两次(一次为b,一次为c,即使它是更聪明的发送消息只有一次,b可能刚刚通过它,但由于b不知道c的存在,消息将会跳到b跳两次)? – user179156 2012-04-17 16:02:57

+0

@ user179156您无法将用户套接字连接到另一个用户套接字,因此您的a-> b-> c示例没有意义。我想你的意思是b是路由器。在这种情况下,a只发送一次消息,甚至不知道c。 – Oktalist 2013-05-08 13:37:58

+0

@ user179156对于b <-a->这种情况,其中两个连接共享一些基础设施,MQ不能期望知道这一点,您可以自行设计您的zeromq套接字拓扑以更好地适应您的情况。你可能想要一个经纪人。 – Oktalist 2013-05-08 13:46:51

0

对于多用户发布/订阅的更有效的机制是使用多播,由此单个消息遍历网络并被所有订阅者接收(然后他们可以过滤他们想要的内容)。

ZeroMQ supports标准化的可靠多播称为Pragmatic General Multicast

这些参考资料应该能让你知道它是如何工作的。请注意,组播通常只能在单个子网中工作,并且可能需要路由器配置或TCP网桥才能跨越多个子网。

+0

不是一个非常优雅的方式,因为所有的消息都被接收方接收,并且负担在接收方丢弃消息,影响了延迟要求:( – user179156 2012-04-17 23:43:29

+0

当然.. ..在网络资源利用和接收器资源利用之间的折扣。根据您的需求选择 – scaganoff 2012-04-18 07:45:19

+0

你的问题涉及到“数百万订阅者”,一个发布者管理数百万个直接tcp连接和复制消息到每个消息的延迟是多少?最后的穷人订阅消息的方式,多播是一个非常优雅的为大量用户提供发布/订阅的机制ZeroMQ支持可插拔传输:tcp,pgm或其他选择 – scaganoff 2012-04-18 23:49:50