经典的 ZeroMQ PUB 模式,类似于 :
我在我的一个应用程序中注意到,某些消息的格式非常繁重并且需要花费大量时间。当我没有该主题的订阅者时,我所做的所有这些工作都是徒劳的。
我想知道是否有一种方法可以在格式化消息的其余部分之前检查主题是否已订阅。
我知道会有 TOCTOU 问题:
1. 检查主题是否已订阅(不是)
2.(ZMQ接收主题订阅)
3.数据未发送...
或
1. 检查主题是否已订阅(是)
2.开始格式化消息
3.(ZMQ收到该主题的取消订阅)
4.发送到socket,数据没有发送(浪费时间)
...我两者都同意。
我尝试过使用多部分消息(首先发送“标题/主题”而不格式化消息的其余部分)但是:
- 它似乎没有达到我的意思
- 我的订阅者还必须处理多部分消息(可以做一个简单的
zmq_recv()
),这有点烦人
有什么想法吗?我想我知道在哪里修补
xpub.cpp
,添加一个复制/粘贴部分 xpub::xsend()
的方法(https://github.com/zeromq/libzmq/blob/656205b5f9159677d325cff5e6e26c97f95d8cd7/src/xpub.cpp#L289 )但我什至不确定 ZMQ 社区是否会对此感兴趣。
是的,我们可以。我们可以在发送消息之前检查订阅者吗?
如果确实有这样的需要,请注意
XPUB
原型收集传入的订阅管理消息(如果它们到达)可用于执行类似的操作。这并不意味着人们可以盲目地依赖这一点。除非在完全受限的环境中,严格的版本控制和执行策略是强大且到位的,否则总会有一个客户端不使用更新的、更改的版本来执行主题过滤
(X)PUB
SUB
端,那么 (X)PUB
端主题过滤应该被完全模拟”相信”这样的发送前测试政策正在被采用。
该死的版本管理:o)
您可能还知道,主题 -过滤 (从那时起,希望将继续如此) 不需要任何格式,多部分消息传递开销越少。它作为一个简单的位字段匹配工作,其性能已经过调整,所以谁会愿意在这个域中浪费任何一纳秒的附加开销成本呢?