ZMQ - 套接字或一次性代理之间的转发请求

时间:2017-10-10 19:13:05

标签: zeromq

我正在努力连接两个插座:

  • 前端(ROUTER) - 处理客户请求并将其转发到后端

  • backend(ROUTER) - 接收来自前端的请求,并使用多个工作人员(需要一些初始化,配置等)来处理它们。

服务器代码如下所示:

void server_task::run() {
    frontend.bind("tcp://*:5570");
    backend.bind("inproc://backend");

    zmq::pollitem_t items[] = {
        { frontend, 0, ZMQ_POLLIN, 0 },
        { backend, 0, ZMQ_POLLIN, 0}
    };

    try {
        while (true) {
            zmq::poll(&items[0], 2, -1);
            if (items[0].revents & ZMQ_POLLIN) {
                frontend_h();
            }

            if (items[1].revents & ZMQ_POLLIN) {
                backend_h();
            }
        }
    }
    catch (std::exception& e) {
        LOG(info) << e.what();
    }
}

frontend_hbackend_h是处理程序类,每个都可以访问这两个套接字。

问题是: 考虑同步执行frontend_h()backend_h()如何将frontend_h()中处理的请求转发给backend_h()

我试着简单地使用后端套接字重新发送消息:

void frontend_handler::handle_query(std::unique_ptr<zmq::message_t> identity, std::unique_ptr<zmq::message_t> request) {
    zmq::message_t req_msg, req_identity;
    req_msg.copy(request.get());
    req_identity.copy(identity.get());

    zmq::message_t header = create_header(request_type::REQ_QUERY);
    backend.send(header, ZMQ_SNDMORE);
    backend.send(message);
}

但在zmq::poll执行后run() {}停留在handle_query()

1 个答案:

答案 0 :(得分:0)

坚持zmq::poll()

您的代码已指示.poll()方法阻止,正如文档所述:

  

如果超时值为-1,zmq_poll()将无限期阻止,直到发生请求的事件......

如何转发请求?

一旦您的代码位于同一位置并且第一个接收处理程序可以请求,重新编组每条消息(+1至少使用.copy()方法并避免重新打包开销)似乎相当昂贵并直接调用后者的任何适当方法(并且没有任何Context() - 处理相关的工作和开销。