2013-10-15 37 views
3

我有多個nodejs服務器位於不同的位置,我需要通過TCP套接字創建一個IPC,我正在使用ZeroMQ。我需要以異步方式請求/響應或發佈/訂閱,並確認發送了消息,但看到node-zeromq模塊,我發現所有發送方法都是同步的,並且無法確認通過發送的消息回調NodeJS ZeroMQ,沒有發送回調?

總之, 我需要像socket.send(message,function(err,res){;}); 但我發現這個socket.send(message)

任何人知道如何做到這一點使用ZeroMQ或任何其他方式我可以IPC reliablly並用肯定的迴應?

UPDATE:伊夫發現https://github.com/visionmedia/axon,軸突及其REQ/REP發送方法有所回調,將是巨大的,如果任何人都可以擺脫這個是哪裏。建議更多的光線?

+0

沒有什麼可以肯定的是,消息是在ZeroMQ中真正發送的,所有的API函數都會將消息排入隊列,以便稍後在可能的情況下由後臺線程發送消息。當您需要確認時,另一端點在收到消息時必須將其發回。但我同意,也許可以用更好的方式編寫這些庫,以便您可以確切地說出哪些API調用失敗。 – tchap

+0

axon req/res讓我這樣做。但我不知道,如果它的生產好 –

+0

你可能不得不嘗試:-)但它看起來像2個月前有1.0.0發佈... – tchap

回答

0

您可以使用請求/回覆模式而不是ZMQ的發佈/訂閱模式。我相信當你提出請求時,有一個回調來監聽響應,而不是pub.send()...

0

zeromq.node還不支持對send消息的回覆回調。

有一個問題在GitHub上討論了好幾年,人們認爲這是一個明智的修改。

我遵循another question的建議,因爲我真的想在更高級別使用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庫得到最終更新。