【发布时间】:2016-01-28 11:53:50
【问题描述】:
我有一个节点应用程序使用此处找到的 Node-ZMQ 绑定处理来自另一个应用程序的一些 ZeroMQ 事件:https://github.com/JustinTulloss/zeromq.node
我遇到的问题是某个事件的操作需要很长时间才能处理,这似乎会阻止在此期间处理任何其他事件。尽管应用程序当前没有集群,但这样做只会提供更多线程,并不能真正解决问题。我想知道是否有一种方法可以让这些异步调用在它们处理时不阻塞其他传入请求,以及如何实现它们。
这是我目前正在做的一个高度浓缩/人为的代码示例:
var zmq = require('zmq');
var zmqResponder = zmq.socket('rep');
var Client = require('node-rest-client').Client;
var client = new Client();
zmqResponder.on('message', function (msg, data) {
var parsed = JSON.parse(msg);
logging.info('ZMQ Request received: ' + parsed.event);
switch (parsed.event) {
case 'create':
//Typically short running process, not an issue
case 'update':
//Long running process this is the issue
serverRequest().then(function(response){
zmqResponder.send(JSON.stringify(response));
});
}
});
function serverRequest(){
var deferred = Q.defer();
client.get(function (data, response) {
if (response.statusCode !== 200) {
deferred.reject(data.data);
} else {
deferred.resolve(data.data);
}
});
return deferred.promise;
}
编辑** 这是代码的要点:https://gist.github.com/battlecow/cd0c2233e9f197ec0049
【问题讨论】:
-
抱歉,这是做作,请允许我编辑。
-
如果
serverRequest()是真正的异步,它不应该阻塞任何东西。 -
老实说,这就是我的想法,但事实并非如此,我不确定如何最好地优化代码,或者我在哪里失误。
-
@Brian,您当前的示例是您的实际代码,还是只是一个人为的代码示例?因为您正在显示不会阻塞的完全异步 I/O。但是,如果您编写了任何 javascript,而不是 I/O 调用,而是在行 javascript,这需要很长时间才能执行,即使您异步调用它也会阻塞主事件循环(即即使它是在
client.get()调用中运行)。 See my answer here 了解更多信息。 -
我想知道是否有可能某些 zmq 方法实际上是同步的,而不是异步的,例如 this line of code?
标签: javascript node.js zeromq