【问题标题】:ZeroMQ - Can we check subscribers before sending a message?ZeroMQ - 我们可以在发送消息之前检查订阅者吗?
【发布时间】:2020-03-10 15:19:31
【问题描述】:

经典的 ZeroMQ PUB 模式,类似于:

  1. 格式化您的完整消息
  2. 发送您的信息
  3. (由ZMQ管理)如果主题有订阅者,则发送,否则丢弃?

我在我的一个应用程序中注意到,一些消息的格式非常繁重并且需要很多时间。当我没有该主题的订阅者时,我做所有这些工作都是徒劳的。

我想知道是否有办法在格式化消息的其余部分之前检查主题是否已订阅。

我知道会有 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 社区会对此感兴趣。

【问题讨论】:

    标签: zeromq


    【解决方案1】:

    如果您从未使用过 ZeroMQ,
    您可以在这里先看看"ZeroMQ Principles in less than Five Seconds"
    在深入了解更多细节之前



    “我们可以在发送消息之前检查订阅者吗?”

    是的,我们可以。

    如果确实有这种需要,请注意 XPUB Archetype 收集传入的订阅管理消息(如果它们到达)可用于执行此类操作。

    这并不意味着人们可以盲目地依赖它。除非在完全受限的环境中,严格的版本控制和执行策略是强大且就地的,否则总会有一个客户端不使用更新的、更改的版本,在 (X)PUB-边。如果有这样的机会,应该完全模拟 SUB 端的主题过滤,如果它将所有订阅管理记录交付到 (X)PUB 端,正如新版本所期望的那样,然后再开始盲目地“相信”这种test-before-send政策正在被采纳。

    该死的版本管理 :o)

    您可能还知道,主题-过滤 (因为永远并且希望会一直如此) 不需要任何格式多部分消息传递开销。它作为一个普通的位域匹配工作,其性能已经过调整,所以谁愿意浪费任何一个 [ns] 这个域的一些附加开销成本?

    欢迎来到零之禅的艺术

    【讨论】:

    • 嗨,谢谢。你的意思是我必须重新实现 pub 套接字的主题接收和过滤功能?
    • 我在这附近说过什么吗?没有。文本尝试了,在我的知识和写作风格的所有限制下,鉴于已记录的已发布 API 属性,用户级代码(应用程序)应遵循已知的属性,Context()-instances 的工作原理。主题过滤在每个已发布的 API 规范的任一版本中都得到了详细的描述。不同版本的共存是一个事实,很难避免。进行本地主题过滤(在某些情况下)或网络远程流量和延迟过滤(在其他情况下)的任何和所有差异。零空间猜测:o)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多