我目前正在设计CZMQ(ZeroMQ的高级C绑定)中的消息代理。我的代理人设计有点像典型的星形拓扑,但是带有额外的REP
套接字以与发布者和订阅者进行通信。我还有一个PUB
插槽,用于通知发布者订阅者。
当节点连接到代理时,它必须通过此REP
套接字进行握手,然后将该节点添加到服务器的内部列表中。我的节点结构如下:
struct node {
int type;
char *uuid;
char *path;
size_t path_len;
int64_t timestamp;
};
path
变量是发布者/订阅者正在使用的订阅路径,例如/path/to/subscription
。
我保留两个不同的内部列表,一个用于发布者,一个用于订阅者。我想对其进行设计,以便当发布者没有订阅者时,服务器将通知该发布者,以便它可以停止发送消息,直到另一个订阅该发布者的订阅者为止。
我遇到的问题是我不知道如何确定发布者是否没有订阅者,例如,假设某个发布者将发布到/path/to/data
,然后我需要查找是否存在任何发布者。订阅了/path
,/path/to
或/path/to/data
的订阅者。
此网络中的每个节点都有唯一的ID,uuid
。每个发布者都有一个SUB
套接字,可以订阅自己的uuid
,以便可以从服务器接收更新。
答案 0 :(得分:1)
几个选项:
Alt.1)
创建独立于标准PUB/SUB
可扩展形式通信行为原型模式的自己的显式订阅管理层。在那里,您可以实现设计想要的任何功能。
Alt.2)
使用标准的XPUB/XSUB
原型,其中包含订阅和取消订阅消息。但是,这些是弱类型的信号,可能只是想念或从未想过要收到这样的消息,因此,如果不显示弱信号,则您的处理策略必须足够强大,以免陷入麻烦。 >
ZMQ_XPUB
与
ZMQ_PUB
相同,只是您可以以传入消息的形式从对等方接收订阅。订阅消息是字节1
(用于订阅)或字节0
(用于取消订阅),后跟订阅主体。还会收到没有sub / unsub前缀的邮件,但对订阅状态没有影响。
ZMQ_XSUB
与
ZMQ_SUB
相同,只不过您通过发送订阅消息到套接字来进行订阅。订阅消息是字节1
(用于订阅)或字节0
(用于取消订阅),后跟订阅主体。也可以发送不带sub / unsub前缀的邮件,但不会影响订阅状态。
最后但并非最不重要的一点是,不必担心不存在SUB
-,因为Context()实例的内部数据泵的管理非常了解连接的状态并且没有麻烦在SUB
-s的空白列表中。如果使用.setsockopt( ZMQ_CONFLATE, 1 )
方法,则SUB
-s的Queue存储容量管理的本地分配资源将仅在本地Queue-head-end存储中为每个< sub> 几乎 “实时”-SUB
。
那很可爱,不是吗?