如何识别没有订阅者的节点? (零)

时间:2019-07-16 13:01:39

标签: c zeromq publish-subscribe

我目前正在设计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,以便可以从服务器接收更新。

1 个答案:

答案 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

那很可爱,不是吗?