【问题标题】:ZeroMQ: asynchronous repliesZeroMQ:异步回复
【发布时间】:2013-02-25 08:11:49
【问题描述】:

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

目前,我的模式如下所示:

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

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

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

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 (client) -> ROUTER -> DEALER -> DEALER (worker),但这似乎也不起作用,因为它仍然会阻塞 worker 端的并发任务。

【问题讨论】:

  • 我真的看不出您的设置有问题。 ZMQ 总是异步运行,除了用户端与套接字的交互。如果您不希望这些阻塞,您可以使用非阻塞模式并轮询可操作的套接字。

标签: c zeromq


【解决方案1】:

(客户端)经销商路由器||路由器 经销商(工人) 在这种连接模式中,什么都不会阻塞,因此您可以根据需要交错接收和发送。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多