如何识别没有订阅者的节点? (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
.
很可爱,不是吗?
我目前正在 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 byte1
(for subscriptions) or byte0
(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 byte1
(for subscriptions) or byte0
(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
.
很可爱,不是吗?