【发布时间】: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 交付的不确定性和延迟偏差的主要抖动。