ZeroMQ推/拉模式

时间:2015-05-07 16:41:42

标签: push zeromq pull

我决定写一个测试代码,看看推动器是多少 - 许多拉出器捆绑工作,我的怀疑成真。

拉拔器按顺序接收消息,例如第一个拉出器连接第一个消息,第二个接受第二个消息等等。我已经模拟了其中一个拉出器在收到消息后保持忙碌的情况,但是当它到来收到消息的时候,无论如何都排队了,所以我已经失去了#39;信息。那很糟糕。我希望下一封“免费”收到此消息。车夫。这是真的吗?

我的测试代码。我使用zmqpp作为绑定

void main()
{
    auto _socket = sIpcContext->CreateNewSocket(zmqpp::socket_type::push);
    _socket->bind("tcp://*:4242");


    for (auto i = 0; i < 3; ++i)
    {
        new std::thread([&](int _idx)
        {
            auto idx = _idx;
            auto sock = sIpcContext->CreateNewSocket(zmqpp::socket_type::pull);
            sock->connect("tcp://127.0.0.1:4242");

            for (;;)
            {
                std::string msg;
                sock->receive(msg);
                std::cout << idx << " received: " << msg << std::endl;
                if (idx == 1)
                {
                    std::cout << "Puller 1 is now busy" << std::endl;
                    std::this_thread::sleep_for(std::chrono::seconds(10000));
                }
            }
        }, i);
    }

    for (auto i = 0;; ++i)
    {
        _socket->send(std::to_string(i));
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

我得到了这个输出:

0 received: 0
0 received: 1
1 received: 2
Puller 1 is now busy
2 received: 3
0 received: 4
2 received: 6
0 received: 7
2 received: 9
0 received: 10
2 received: 12
0 received: 13
2 received: 15

正如您所看到的,5号,8号等等已经错过了&#39;但实际上排在拉马#1

2 个答案:

答案 0 :(得分:2)

是的,推拉式插座很笨,可以让它发生。您可以使用其他套接字(例如路由器/经销商)将工作发送给自由工作人员。

答案 1 :(得分:2)

0MQ指南解释了这个案例(称之为邮局类比):

  

这是邮局的比喻。如果每个计数器有一个队列,和   你有一些人购买邮票(一个快速,简单的交易),和   有些人开新账户(交易很慢),然后你   将会发现邮票购买者被排除在队列之外。就像在   邮局,如果你的消息传递架构不公平,人们就会得到   恼火。

     

邮局的解决方案是创建一个队列   即使一个或两个计数器卡在慢速工作,其他计数器   将继续以先到先得的原则为客户服务。

长话短说,在处理行车缓慢的工人时,你应该使用ROUTER。