sockets - Pub Sub 实现零 mq 3.xx

标签 sockets network-programming publish-subscribe zeromq messagebroker

我一直在使用 qpid,现在我正试图转向减少代理的消息传递系统,但我对 Pub Sub 模式中的网络流量感到非常困惑。我阅读了以下文件:
http://www.250bpm.com/pubsub#toc4
我真的很困惑订阅转发是如何完成的?

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

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

同样在树形图中(来自包含 P、D、C 的链接),我最初假设 C 和 C 是两个订阅者,而 P 是唯一的发布者(D 只是随机跳),但现在似乎我们将 D 作为零 mq 。 C 订阅 D 并且 D 订阅 P 吗?或两者都 C 只订阅 P (更通用的是,每个节点是否仅在 中订阅其父节点)。很抱歉这个新手问题,但似乎我在这里遗漏了一些明显的东西,如果有人能提供更多见解,那就太好了。

最佳答案

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

现在,当您在 pub-sub 场景中仅订阅某些事件时,zeromq 用于过滤订阅方的消息,从而导致从发布者到至少多个订阅者的不必要的网络流量。

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

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

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

关于sockets - Pub Sub 实现零 mq 3.xx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10183539/

相关文章:

c - 发现 IP 地址是 DHCP 还是静态

java - RxJava : PublishSubject acts synchronously

python - 与多个端口、协议(protocol)和 react 器混合在一起

c++ - 如何捕获 boost asio boost::system::error_code 连接异常与其他异常分开?

android - android 上的双 SPP 蓝牙连接

c - 段错误 - 套接字编程

python - 如何通过互联网(不是本地)使用 Python 3 套接字客户端/服务器设置?

sockets - 使用消息队列扩展WebSockets

meteor - 有没有办法知道 meteor 订阅何时是 'valid' ?

c - c 中的 setTimeOut 等价物?