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

How to identify a node that has no subscriber? (ZeroMQ)

我目前正在 CZMQ(ZeroMQ 的高级 C 绑定)中设计消息代理。我的代理设计有点像典型的星形拓扑,但有额外的 REP-套接字来与发布者和订阅者通信。我还有一个 PUB-socket 来通知发布者有关订阅者的信息。

当一个节点连接到代理时,它必须通过这个 REP-socket 进行握手,然后该节点被添加到服务器的内部列表中。我的节点结构如下所示:

struct node {
    int type;
    char *uuid;
    char *path;
    size_t path_len;
    int64_t timestamp;
}; 

path变量是publisher/subscriber正在使用的订阅路径,例如/path/to/subscription

我有两个不同的内部列表,一个给发布者,一个给订阅者。我想设计它,以便当发布者没有订阅者时,服务器将通知该发布者,以便它可以停止发送消息,直到另一个订阅者订阅该发布者。

我遇到的问题是我不知道如何确定发布者是否没有订阅者,例如假设发布者发布到 /path/to/data,然后我需要查找是否有是订阅了 /path/path/to/path/to/data.

的任何订阅者

这个网络中的每个节点都有一个唯一的 ID,uuid。每个发布者都有一个 SUB-socket 订阅它自己的 uuid 以便它可以从服务器接收更新。

多个选项:

Alt.1)
创建您自己的显式 subscription-management 层,独立于标准 PUB/SUB 可扩展正式通信行为原型模式。在那里你可以实现你的设计想要的任何功能。

Alt.2)
使用标准 XPUB/XSUB 原型,其中包含订阅和取消订阅消息。然而,这些是 weak-type 信号,人们可能只是错过或从未打算接收这样的消息,因此如果 weak-signalling 消息不是呈现。

ZMQ_XPUB

Same as ZMQ_PUB except that you can receive subscriptions from the peers in form of incoming messages. Subscription message is a byte 1 (for subscriptions) or byte 0 (for unsubscriptions) followed by the subscription body. Messages without a sub/unsub prefix are also received, but have no effect on subscription status.

ZMQ_XSUB

Same as ZMQ_SUB except that you subscribe by sending subscription messages to the socket. Subscription message is a byte 1 (for subscriptions) or byte 0 (for unsubscriptions) followed by the subscription body. Messages without a sub/unsub prefix may also be sent, but have no effect on subscription status.

最后但同样重要的是,不必担心没有 SUB-s 存在,因为 Context()-实例的内部 data-pumps' 管理是 well-aware 关于连接' 状态并且在 SUB-s 的空列表上没有问题。如果使用 .setsockopt( ZMQ_CONFLATE, 1 ) 方法,本地分配给 SUB-s 队列 storage-capacity 管理的资源将只保留本地 Queue-head-end 存储中的一条最新消息每个几乎"live"-SUB.

很可爱,不是吗?