【问题标题】:How to get ZeroMQ Timestamp?如何获取 ZeroMQ 时间戳?
【发布时间】:2018-06-13 22:49:52
【问题描述】:

我正在编写一个 C++/ZMQ 脚本,它让订阅者从由单独脚本运行的发布者获取数据。无法编辑发布者代码,需要获取 ZeroMQ 订阅者收到消息的时间。

基本上,我有:

void *zmq_subscriber_ = zmq_socket( context, ZMQ_SUB );
zmq_setsockopt( zmq_subscriber_, ZMQ_SUBSCRIBE, NULL, 0 );

while ( ( zmq_msg_recv( &msg, zmq_subscriber_, ZMQ_DONTWAIT ) ) < 0 )
{ usleep( 1000 ); }

我需要知道订阅者何时收到消息。有没有办法从 ZeroMQ 获取这些信息?提前感谢任何可以提供帮助的人!

【问题讨论】:

  • “我需要知道”。我在那里是谁或什么?你作为人?只需让订阅者打印出它收到消息的时间。发布者?为此,订阅者必须发回一个 ACK​​。不能只用 PUB/SUB 来完成。订户?只需读出您收到消息的时间。
  • @GoswinvonBrederlow 你可能已经知道了,关于什么时候一个 msg 实际到达“进入”Context()-控制域的零知识,因为“外部”-世界只是异步“询问”Context()-internal-service,是否有新消息要从队列中检索,但不知道该数据已经在那里等待了多长时间,以便稍后获取并传递到外部世界.所以外部代码可能会记录一个时间戳,但这只是指一个时刻,当外部世界试图学习并且最终确实已经学习了一个消息可以是.recv()'d
  • @user3666197 是的。但是,如果您轮询消息,则消息到达和轮询返回之间的差异通常可以忽略不计。
  • 不一定,先生。即使在非阻塞模式下仔细.poll()-s,仍然存在主要不确定性(盲点),在您的“当前”线程确实获得 CPU 调度程序时隙之前实际需要多长时间执行,并且不受控制,并且在负载下会变得更糟,当您的优先级驱动轮次可以回到 CPU 调度程序代码执行队列中时 + 对各自的 Context()-s IO-thread 相同有效,因此一连串主要不协调的异步事件只会增加 E2E 交付的不确定性和延迟偏差的主要抖动。

标签: c++ time zeromq


【解决方案1】:

有没有办法从 ZeroMQ 获取这些信息?

幸运的是不是直接来自 ZeroMQ API 原样(在 2018/Q2 中)。


有什么选择吗?

鉴于粗略的 TimeDOMAIN 分辨率很好,每次您的代码重新循环 while(){...; &lt;here&gt; } 代码块时只需存储一个时间戳。这种方法有一个大约usleep()-duration 的盲点 - 延迟,无法确定更精确的收据时刻。

鉴于这还不够,开始使用Poller.poll() 方法的非阻塞模式,并将任何此类延迟降低到您的意图可以使用的水平。一旦处理了一个几乎-零延迟.poll(),在Poller.poll()“内部”具有零等待时间,再加上避免花费任何这样的usleep(),以尽量减少盲点。

如果极度需要,重构代码并引入新的(私有)API 扩展,以便从Context()-instance 内部状态寄存器中读取这些详细信息。这将使您更接近(如果不是最接近的话)消息到达 SUBContext() 内部处理的实际时刻。

【讨论】:

  • @T-Boone 很高兴它确实有所帮助。欢迎来到 StackOverflow 社区。​​span>
猜你喜欢
  • 2014-11-21
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2018-08-30
  • 1970-01-01
  • 2021-07-20
  • 2015-08-20
相关资源
最近更新 更多