我正在编写一个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获取此信息?提前感谢任何有帮助的人!
答案 0 :(得分:2)
有没有办法从ZeroMQ获取此信息?
幸运的是,不是直接来自ZeroMQ API(2018 / Q2)。
鉴于粗略的TimeDOMAIN分辨率很好,只需在每次代码重新循环while(){...; <here> }
代码块时存储时间戳。这种方法有一个关于usleep()
- 持续时间的盲点 - 延迟,其中更准确的收货时刻是不可判断的。
如果这还不够,请开始使用Poller.poll()
方法的非阻塞模式,并将任何此类延迟降低到您的意图可以使用的级别。一旦处理几乎 -zero-latency .poll()
,其中“等待”持续时间为“内部”Poller.poll()
,请避免花费任何此类usleep()
以尽量减少盲目-spot。
如果极端需要,请重构代码并引入新的(私有)API扩展,以便从Context()
- 实例内部状态寄存器中读取此类详细信息。如果不是最接近的话,这会让您更接近消息到达 SUB
- Context()
内部处理的实际时刻。