在zeromq pub sub上丢失了消息

时间:2011-09-19 11:51:45

标签: c++ publish-subscribe zeromq

我正在尝试使用zeromq框架实现pub子设计模式。 我们的想法是推出订阅者,然后推出发布者。 订阅者将收听100条消息,发布者将发布100条消息。 到现在为止还挺好... 然而,实际发生的是,即使订户已经启动并且在发布者发布时运行,订阅者也不会收到所有消息(如果发布者将发送至少500个订阅者将收到100条消息信息)。似乎发布者发送的第一封邮件不会发送给订阅者。

有什么想法吗?

提前致谢, 奥马尔。

订阅者代码(在发布商之前发布)

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;

}

4 个答案:

答案 0 :(得分:18)

请参阅http://zguide.zeromq.org/page:all#Missing-Message-Problem-Solver并在该网页上搜索“慢速加入者”。

基本上,建立连接需要一些时间(几毫秒),在那段时间内可能会丢失大量消息。发布者需要在开始发布之前稍微睡一会儿,或者(更好)它需要与订阅者明确同步。

答案 1 :(得分:2)

在0MQ中,成功的send()并不意味着数据立即通过网络发送。 http://api.zeromq.org/2-1:zmq-send。您的消息非常小,AFAIR 0MQ对小消息进行某种缓冲以更有效地使用网络。

如果我没记错的话,0MQ的out_batch_size中的config.hpp会控制此类行为。

答案 2 :(得分:2)

请查看guide

  1. 发布者发送&#34;你好&#34;
  2. 收到&#34; hello&#34;的每个订阅者,通过REQ / REP套接字向发布者发送消息
  3. 当发布者获得足够的REQ / REP消息时,它就会开始发布数据

答案 3 :(得分:1)

要注意的一件事(超出以前的评论者注意到的)是你的关机程序。

代码段可能只是不完整,但我不知道你是如何处理关机的。特别是您可能实际上丢失了发送的 last 消息。请查看 zmq_close zmq_term ZMQ_LINGER 的文档。如果您实际上正在调用这些函数而只是终止应用程序,那么有可能是使用 zmq_send()发送但尚未发送的消息在关机时被转移到网络正在丢失。

要检查哪些邮件正在丢失,您可能会尝试发送除时间戳之外的序列号。