我正在努力连接两个插座:
前端(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_h
和backend_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()
。
答案 0 :(得分:0)
zmq::poll()
?您的代码已指示.poll()
方法阻止,正如文档所述:
如果超时值为-1,
zmq_poll()
将无限期阻止,直到发生请求的事件......
一旦您的代码位于同一位置并且第一个接收处理程序可以请求,重新编组每条消息(+1至少使用.copy()
方法并避免重新打包开销)似乎相当昂贵并直接调用后者的任何适当方法(并且没有任何Context()
- 处理相关的工作和开销。