2013-03-09 62 views
7

我正在构建一个基础架构(C语言),其中几个独立的服务通过ZeroMQ进行通信。现在,为了使这一切都快速平稳运行,我希望ZeroMQ异步运行。
我知道ZeroMQ的IO线程已经分离了,但我想同时执行多个任务。ZeroMQ:异步回复

此刻,我的模式是这样的:

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); 
} 

现在,有什么办法可以实现这个(即组合两个事件循环)吗?

我已经看过DEALER(客户端) - > ROUTER - > DEALER - > DEALER(worker),但这似乎也不起作用,因为它仍然会阻止工作端的并发任务。

+2

我真的没有看到您的设置的问题。 ZMQ总是异步运行,除了用户端与套接字的交互。如果你不想阻止这些,你可以使用非阻塞模式并轮询可操作的套接字。 – djc 2013-03-13 10:05:38

回答

2

(客户)经销商< - > ROUTER | < - > |路由器< - >经销商(工作人员) 在这种连接模式下,什么都不会阻塞,因此您可以交叉接收和发送您想要的。