【问题标题】:What's the best way to subsample a ZMQ PUB SUB connection?对 ZMQ PUB SUB 连接进行二次采样的最佳方法是什么?
【发布时间】:2015-04-28 15:27:38
【问题描述】:

我有一个 ZMQ_PUB 套接字以 ~50Hz 的频率发送消息。一个目的地需要对每条消息做出反应,因此它有一个标准的 ZMQ_SUB 套接字,带有一个 while(true) 循环检查新消息。第二个目的地应该每秒只对“最近的”消息做出一次反应。也就是说,我的第二个目的地需要进行二次抽样。

对于第二个目的地,我相信我想要一个基于时间的循环,它以我想要的速率 (1Hz) 调用,recv() 接收最新消息,丢弃其余消息。我相信这是通过订阅者上的 ZMQ_HWM 完成的。是否需要在某处设置其他选项?

我是否需要担心具有不同 HWM 的不同订阅者?出版商会生气吗?遗憾的是 ZMQ_RATE 仅适用于多播套接字。

有没有最好的方法来完成我正在尝试的事情?


zmq v3.2.4

【问题讨论】:

    标签: sockets zeromq publish-subscribe sample


    【解决方案1】:

    HighWaterMark 不会是您的问题的绝佳解决方案。将订阅者设置为 10 并每秒读取 1 条消息,只会先缓慢地向您提供旧消息,然后丢弃所有新消息,因为已达到限制。

    您可以在发布者上使用一个主题,使您能够过滤每 50 条消息,例如将主题设为 messageCount % 50 并订阅 0

    否则也许你不应该使用 zmq 的 pub/sub,而是你自己的看起来像路由器/经销商,允许你订阅采样消息。

    最后,您也可以将它们全部发送出去。 50 m/s 在 zmq 中几乎算不上什么(如果它们不是数据量大的话,比如 megs),然后每 50 条消息才使用一次。

    【讨论】:

    • 我是 SO 新手,所以也许有更好的响应方式,但我找到了一个适合我需要的解决方案(尽管可能并不理想)。我添加了一个订阅每条消息的中间对象,将最新消息存储到成员变量中,并定期重新发布最后存储的任何内容。我有 cpp 和 python 实现。然后,无论我想在哪里接收采样数据,我都会在它前面实例化这个对象并旋转它。目的地没有注意到内容的任何差异,只有评分。
    • 有趣的解决方案。您是否有多个 intermediate objects 或考虑拥有多个?
    • 没有什么能阻止我拥有多个“速率限制”对象。我可以将它们部署在每个端点的前面,或者作为需要特定速率的任何端点的一对多重新发布者(一个以 100Hz 运行,另一个以 50Hz 运行)。我很高兴发布代码。我是在评论中这样做,还是编辑我的问题?
    • 我想我会更容易将其添加为答案的编辑。否则请参考要点。
    猜你喜欢
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2020-12-05
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多