2013-10-15 5 views
3

У меня есть несколько серверов nodejs, расположенных в разных местах, и мне нужно создать IPC через сокеты tcp, и я использую для этого ZeroMQ. Мне нужно что-то вроде запроса/ответа или pub/sub в асинхронном режиме с подтверждением того, что сообщение отправлено, но, увидев модули node-zeromq, я обнаружил, что все методы отправки являются синхронными, и нет способа подтвердить сообщение, отправленное через Обратный вызовNodeJS ZeroMQ, нет обратного вызова для отправки?

Короче, мне нужно что-то вроде socket.send(message,function(err,res){;}); , но я нашел, что это socket.send(message)

Каждый знает, как это сделать с помощью ZeroMQ или любым другим способом я мог бы IPC reliablly и с утверждением в качестве ответа?

UPDATE: Ive нашел https://github.com/visionmedia/axon, Axon и его REQ/респ отправить метод имеет функцию обратного вызова, было бы здорово, если кто-нибудь может пролить больше света, об этом .Suggestions?

+0

Нет ничего похожего на подтверждение того, что сообщение было отправлено действительно в ZeroMQ, все функции API просто помещают в очередь сообщения, которые позднее отправляются фоновым потоком, когда это возможно. Когда вам нужно подтверждение, другой конечный пункт должен отправить его обратно, когда он получит сообщение. Но я согласен с тем, что, возможно, библиотеки могут быть написаны лучше, так что вы можете сказать, какой вызов API был неудачным. – tchap

+0

axon req/res позволяет мне сделать это. Но я не уверен, если его производство ОК –

+0

Вам, вероятно, придется попробовать :-) Но похоже, что был выпуск 1.0.0 около 2 месяцев назад ... – tchap

ответ

0

Вы можете использовать шаблон request/reply вместо шаблона pub/sub с 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 обновляется в конце концов.

Смежные вопросы