ZeroMQ:异步回复

时间:2013-03-09 22:43:59

标签: c zeromq

我正在构建一个基础架构(在C中),其中几个单独的服务通过ZeroMQ进行通信。现在,为了使这一切能够快速顺畅地运行,我希望ZeroMQ能够异步运行 我知道ZeroMQ的IO线程已经分开,但我想同时执行多个任务。

目前,我的模式如下:

Client -> REQ     |  /\
Router -> ROUTER  |   |
---   proxy   --- |   |
Dealer -> DEALER  |   |
Workers-> REP     \/--|

但是,这需要我设计一个阻塞的同步工作者。使这种异步的唯一方法是增加工作者(线程)的数量,但这对我来说似乎不太可扩展。

此外,工作人员执行的任务本身是异步的(使用他们自己的事件循环)。所以基本上,我希望实现这样的目标:

void *socket = zmq_socket(context, ZMQ_REP);
zsocket_connect(socket, "inproc://backend");

while (1) {
    zmq_msg_t request;
    zmq_msg_init(&request);
    zmq_msg_recv(&request, socket, 0);
    zmq_msg_close(&request);

    do_something(callback, socket);
}

do_something然后会执行一些操作,一旦完成,就会调用回调函数。

void callback(void *data, void *socket) {
    zmq_msg_t reply;
    zmq_msg_init_size(&reply, 5);
    memcpy(zmq_msg_data(&reply), "World", 5);
    zmq_msg_send(&reply, socket, 0);
    zmq_msg_close(&reply);
}

现在,有没有办法实现这一点(即组合两个事件循环)?

我已经调查了经销商(客户) - >路由器 - >经销商 - >经销商(工人),但这似乎也不起作用,因为它仍然阻止了工人端的并发任务。

1 个答案:

答案 0 :(得分:2)

(客户)DEALER< - > ROUTER |< - > | ROUTER< - >经销商(工人) 在这种连接模式中,没有任何东西会被阻塞,因此你可以按需要交错接收和发送。