在zeromq pub sub上丢失了消息

ome*_*ach 14 c++ publish-subscribe zeromq

我正在尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)

发布商代码(在订阅者之后启动)

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;
Run Code Online (Sandbox Code Playgroud)

}

DNA*_*DNA 18

请参阅http://zguide.zeromq.org/page:all#Missing-Message-Problem-Solver并在该网页上搜索"慢速木匠".

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

  • 我建议使用pub与proc直接睡眠的同步...你真的不知道你应该等多久(特别是如果你有远程潜艇)但是有明确的同步(通过req/rep socket是一个好方法)你不必担心猜测...... (2认同)