如何获取 ZeroMQ 时间戳?

How to get ZeroMQ Timestamp?

我正在编写一个 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 获取这些信息?在此先感谢任何可以提供帮助的人!

Is there a way to get this information from ZeroMQ ?

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


有什么选择吗?

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

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

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