Sockets 发布子实现zero mq 3.xx

Sockets 发布子实现zero mq 3.xx,sockets,network-programming,publish-subscribe,zeromq,messagebroker,Sockets,Network Programming,Publish Subscribe,Zeromq,Messagebroker,我一直在使用qpid,现在我正试图转向无代理的消息传递系统,但我真的对Pub-Sub模式中的网络流量感到困惑。我阅读了以下文件: 我真的很困惑订阅转发实际上是如何完成的 我认为zero mq对于底层网络拓扑必须是不可知的,但似乎不是。每个节点如何知道转发什么和不转发什么(例如:在eth网络中,可能有数百万的订阅者和发布者,消息树对我来说似乎不可行。对于那些甚至不知道零mq存在的跃点,他们如何将数据包转发给连接到他们的订阅者,对于他们来说,这只是一个普通的数据包,所以他们只转发多个数据包即使数据包

我一直在使用qpid,现在我正试图转向无代理的消息传递系统,但我真的对Pub-Sub模式中的网络流量感到困惑。我阅读了以下文件: 我真的很困惑订阅转发实际上是如何完成的

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

设备(链接中使用的术语)类似于代理吗?在整篇文章中,设备似乎只是任何一般的中介跃点,它不知道关于零mq套接字的任何信息(只是一个随机网络跃点),如果它确实是一种代理类型的东西,那么这是否意味着对于pub-sub,消息传递树中的所有节点都必须满足作为设备的定义,因此它不是一种无故障的设计


同样在树形图中(从由p,D,C组成的链接中),我最初假设C和C是两个订阅者,p是唯一的发布者(D只是随机跳),但现在似乎我们将D作为零mq。C订阅D,D订阅p吗?或者两者都订阅p(更一般地说,每个节点是否仅在中订阅其父节点)。对于新手问题,我感到抱歉,但我似乎缺少一些显而易见的东西,如果有人能提供更多见解,那就太好了。

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

现在,当您在发布子方案中仅订阅某些事件时,zeromq用于过滤订阅服务器端的消息,从而导致从发布服务器到至少多个订阅服务器的不必要网络流量

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

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


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

向多个订阅者发布/订阅的更有效机制是使用多播,通过多播,单个消息将穿越网络并被所有订阅者接收(然后订阅者可以过滤他们想要的内容)

ZeroMQ是一种标准化的可靠多播,称为


这些参考资料应该能让您了解它是如何工作的。请注意,多播通常只在单个子LAN上工作,可能需要路由器配置或TCP网桥来跨越多个子LAN。

因此,在消息传递树图中,中间设备是实际上的发布者,也是订阅者?对于a->b->c这样的网络,其中a是e only publisher和b,c只是同一主题的订阅者,消息将由a发送两次(一次发送到b,一次发送到c,尽管只发送一次消息会更明智,b可能只是传递了消息,但由于b不知道c的存在,消息将两次到达跃点b)?@user179156您无法将一个订户套接字连接到另一个订户套接字,因此您的a->b->c示例没有意义。我猜您的意思是b是一个路由器。在这种情况下,a只发送一次消息,甚至不知道c。@user179156对于两个连接共享某些基础结构的bc情况,MQ不能期望知道a关于这一点,您可以自行设计zeromq套接字拓扑,使其更适合您的情况。您可能需要一个代理。这不是一种非常优雅的方式,因为所有消息都是由接收方接收的,并且接收方有丢弃消息的负担,这会影响延迟要求:(当然..在网络资源利用率和接收器资源利用率之间进行权衡。您可以根据自己的要求进行选择。您的问题涉及“数百万订户”。发布服务器管理数百万个直接tcp连接并向每个连接复制消息的延迟是多少?最后的可怜订阅者在其余的之后获得消息。多播是向大量订阅者发布/订阅的一种非常优雅的机制。ZeroMQ允许可插拔传输:tcp、pgm或其他。选择最好的对于您的要求。大约1000个订阅和1000个主题,向所有1000个订阅方发送多播消息将产生太多的网络流量(消息发布速度约为100000/秒)用户179156,您似乎不了解多播是如何工作的。如果您有1000个客户端并且正在使用多播,则每个消息都会发送到所有1000个订阅方(或其中的一部分)是一次传输。这就是为什么多播更有效——1000、10000或100000都将消耗大约相同的流量。如果您的网络不可靠,重新传输可能会增加这一点,但大多数本地以太网络都是如此。