[英]lost messages on zeromq pub sub
我正在尝试使用zeromq框架实现pub子设计模式。 我们的想法是推出订阅者,然后推出发布者。 订阅者将收听100条消息,发布者将发布100条消息。 到目前为止一切都那么好......然而实际发生的事情是,即使发布者发布时订户已经启动并运行,订阅者也不会收到所有消息(订阅者将收到100条消息,如果出版商将发送至少500条消息)。 似乎发布者发送的第一条消息不会发送给订阅者。
有任何想法吗?
提前谢谢,奥梅尔。
订阅者代码(在发布者之前发布)
int i=0;
zmq::context_t context (1);
zmq::socket_t subscriber (context, ZMQ_SUB);
subscriber.connect("tcp://localhost:5556");
subscriber.setsockopt(ZMQ_SUBSCRIBE, "", 0);
for (int update_nbr = 0; update_nbr < 100; update_nbr++)
{
zmq::message_t update;
subscriber.recv(&update);
i++;
std::cout<<"receiving :"<<i<<std::endl;
}
发布商代码(在订阅者之后启动)
zmq::context_t context (1);
zmq::socket_t publisher (context, ZMQ_PUB);
publisher.bind("tcp://*:5556");
int i = 0;
for (int update_nbr = 0; update_nbr < 100; update_nbr++)
{
// Send message to all subscribers
zmq::message_t request (20);
time_t seconds;
seconds = time (NULL);
char update [20]="";
sprintf (update, "%ld", seconds);
memcpy ((void *) request.data (), update,strlen(update));
publisher.send(request);
i++;
std::cout << "sending :" << i << std::endl;
}
请参阅http://zguide.zeromq.org/page:all#Missing-Message-Problem-Solver并在该网页上搜索“slow joiner”。
基本上,建立连接需要一点时间(几毫秒),并且在那段时间内可能会丢失大量消息。 发布者需要在开始发布之前稍微睡一会儿,或者(更好)它需要与订阅者明确同步。
请查看指南 。
在0MQ中,成功的send()并不意味着数据立即通过网络发送。 http://api.zeromq.org/2-1:zmq-send 。 您的消息非常小,AFAIR 0MQ对小消息进行某种缓冲以更有效地使用网络。
如果我没记错的话, out_batch_size
的config.hpp
的out_batch_size
控制了这种行为。
要注意的一件事(超出以前的评论者注意到的)是你的关机程序。
代码片段可能只是不完整,但我不知道你是如何处理关机的。 特别是您可能实际上丢失了最后发送的消息。 看一下zmq_close , zmq_term和ZMQ_LINGER的文档。 如果您实际上没有调用这些函数而只是终止应用程序,则有可能在zmq_send()发送但尚未传输到网络的消息在关闭时丢失。
要检查哪些消息丢失,您可能会尝试发送除时间戳之外的序列号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.