【问题标题】:ZeroMQ push/pull patternZeroMQ 推/拉模式
【发布时间】:2016-05-02 14:56:26
【问题描述】:

我决定编写一个测试代码来看看 pusher - many pullers bundle 的工作原理,我的猜想成真了。

Puller 按连接顺序接收消息,例如,第一个消息由连接的第一个 puller 接收,第二个由 2nd 等。我模拟了一种情况,其中一个 pullers 在收到消息后仍然很忙,但是当它是时候收到一条消息了,无论如何它都在排队,所以我已经“丢失”了消息。那很糟。我希望下一个“免费”拉取者能收到这条消息。这是真的吗?

我的测试代码。我使用 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 等“未命中”,但实际上在拉取器 #1 中排队

【问题讨论】:

    标签: push zeromq pull


    【解决方案1】:

    是的,push/pull socket 很笨,可以让这种情况发生。您可以使用其他套接字(例如路由器/经销商)将工作发送给空闲的工作人员。

    【讨论】:

      【解决方案2】:

      0MQ 指南解释了这种情况(称之为邮局类比):

      这是邮局的比喻。如果每个柜台有一个队列,并且 您有一些人购买邮票(快速、简单的交易),并且 有些人开新账户(交易非常慢),那么你 会发现邮票购买者不公平地排在队列中。就像在一个 邮局,如果你的消息传递架构不公平,人们会得到 生气了。

      邮局的解决方案是创建一个队列,以便 即使一两个柜台因工作缓慢而陷入困境,其他柜台 将继续按照先到先得的原则为客户提供服务。

      长话短说,在处理运行缓慢的工作人员时,您应该使用 ROUTER。

      【讨论】:

        猜你喜欢
        • 2012-09-12
        • 2014-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-02
        相关资源
        最近更新 更多