NodeJS ZeroMQ,发送时没有回调函数?

3
我有多个位于不同位置的nodejs服务器,需要在tcp套接字上创建IPC,并使用ZeroMQ进行通信。我需要像请求/响应或发布/订阅这样的异步方式发送消息,并确认消息已发送,但是查看node-zeromq模块,我发现所有发送方法都是同步的,并且没有通过回调函数确认已发送的消息的方法。
简而言之, 我需要类似socket.send(message,function(err,res){;});的东西,但我找到的是socket.send(message) 有人知道如何使用ZeroMQ或其他可靠的方式进行IPC并获得响应吗?
更新:我发现了https://github.com/visionmedia/axon,Axon及其req/rep发送方法具有回调函数,如果有人能更详细地解释一下,那就太好了。有什么建议吗?

在 ZeroMQ 中,没有什么比确认消息是否真正发送了更好的证明。所有 API 函数都只是将消息排队,以便在可能时由后台线程发送。当您需要确认时,另一端点必须在接收到消息时将其发送回来。但我同意,也许库可以以更好的方式编写,以便您可以精确地知道哪个 API 调用失败了。 - tchap
Axon的请求/响应让我可以这样做。但我不确定它是否适用于生产环境。 - Rana Deep
你可能需要尝试一下 :-) 但是看起来大约2个月前已经发布了1.0.0版本... - tchap
2个回答

0

zeromq.node目前不支持send消息的回复回调。

GitHub上已经讨论了几年的问题,人们争论这将是一个明智的修改。

我遵循了另一个问题上的建议,因为我真的想在更高层次上使用Promises,因此需要REQ/REP机制的回调。也就是说,回调从'message'事件处理程序中调用:

var socket, onRepHandler, replyCallback, send;
socket = zmq.socket('req');
onRepHandler = function (reply) {
    // HACK
    // This handler is a workaround until zeromq.node supports
    // direct callback for REQ/REP:
    // https://github.com/JustinTulloss/zeromq.node/issues/48
    if (replyCallback) {
        replyCallback(reply);
    }
    replyCallback = undefined;
};
socket.on('message', onRepHandler(msg));
socket.connect(address);

// Send method with callback
send = function (msg, repcb) {
    if (replyCallback) {
        throw new Error('Cannot send request before receiving reply of preceding request!');
    }
    replyCallback = repcb;
    socket.send(msg);
}

这感觉像是一个可疑的黑客,但我希望 zeromq.node 库最终会得到更新。


0
你可以使用请求/响应模式而不是ZMQ的发布/订阅模式。我相信当你发出请求时,会有一个回调来监听响应,而不是使用pub.send()...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接