Node.js DNode服务器方法超时
我们希望在需要RPC功能的项目中使用NodeJs DNode()。 它已经过设置和测试,似乎非常适合该项目 不过有点小麻烦。远程功能可以由用户定义,因此我们无法控制逻辑。这意味着函数可能写得不好,执行时间过长,甚至可能永远无法完成(无休止的循环) 所以问题:有没有办法在生成的服务器连接/调用上实现超时检查/事件/触发器。Node.js DNode服务器方法超时,node.js,dnode,Node.js,Dnode,我们希望在需要RPC功能的项目中使用NodeJs DNode()。 它已经过设置和测试,似乎非常适合该项目 不过有点小麻烦。远程功能可以由用户定义,因此我们无法控制逻辑。这意味着函数可能写得不好,执行时间过长,甚至可能永远无法完成(无休止的循环) 所以问题:有没有办法在生成的服务器连接/调用上实现超时检查/事件/触发器。 e、 g.如果函数的执行时间超过5秒,则中止该函数并将异常信息返回给客户端 注意:我们已经在客户机上实现了超时逻辑,所以这不是问题。只是不希望虚假的僵尸进程无缘无故地阻塞服务器
e、 g.如果函数的执行时间超过5秒,则中止该函数并将异常信息返回给客户端 注意:我们已经在客户机上实现了超时逻辑,所以这不是问题。只是不希望虚假的僵尸进程无缘无故地阻塞服务器组件 编辑:*--添加代码示例--*
Server(侦听端口8000,callMe()函数调用doWork(),永不结束。)
var dnode=require('dnode');
功能定位(cltId){
console.log('Client:'+cltId);
setTimeout(函数(){doWork(cltId);},5000);
}
var服务器=dnode({
callMe:函数(cltId、cb){
道尔克(cltId);
}
});
服务器监听(8000);
客户端(连接端口8000和rpccallMe(),永远不会返回)
var dnode=require('dnode');
var net=要求的(‘净额’);
var d=dnode();
d、 打开(“远程”,功能(远程){
var cltId='c-'+Math.random().toString(16).slice(2);
remote.callMe(cltId,函数){
console.log('Result='+n);
d、 end();
});
});
var conn=净连接(8000);
连接管道(d)、管道(连接);
当客户端运行时,它将挂起,但它可以被终止,也可以设置超时以结束连接。这样客户就可以继续做其他事情了
但是
服务器仍将愉快地用我们永无止境的一段代码划船离开…随着越来越多的客户端连接并调用dodge代码,我们最终会遇到更多的虚假僵尸,直到最终我想象所有服务器资源都被消耗。我想你对dnode的功能感到困惑。与dnode一起使用的函数仅在定义的一侧执行。看起来好像回调正在被序列化并在连接的另一端执行,但事实并非如此 例如,如果客户端执行以下操作:
var d = dnode({
callMe: function () { while (true) }
});
d.pipe(stream).pipe(d);
服务器调用
callMe()
,客户端将挂起,而(true)
,而不是服务器。客户端代码可以执行以下操作:
d.on('remote', function (remote) {
var cltId = 'c-' + Math.random().toString(16).slice(2);
var t = setTimeout(function() {
t = null;
console.log("timed out!");
d.end();
}, 5e3);
remote.callMe(cltId , function (s) {
if(t === null) return; //too late...
clearTimeout(t);
console.log('Result=' + n);
d.end();
});
});
(未经测试!)是的,没有得到它。我的理解是,您已经定义了客户端将调用的服务器代码。我用一个简单的客户机/服务器示例更新了我的问题,试图帮助澄清。