我们希望在需要RPC功能的项目中使用NodeJs DNode(https://github.com/substack/dnode)。 它已经过设置和测试,似乎非常适合该项目。
虽然有一点小问题。远程功能可以由用户定义,因此我们无法控制逻辑。这意味着函数写得很糟糕,需要花费大量时间来执行,甚至可能永远不会完成(无限循环)。
所以问题:有没有办法在生成的服务器连接/调用上实现超时检查/事件/触发器。
例如如果该函数超过5秒执行时间,则将其中止并将异常信息返回给客户端。
注意:我们已在客户端上实现了超时逻辑,因此这不是问题。只是不要让虚假的僵尸进程无缘无故地堵塞服务器组件。
编辑: * - 添加代码示例 - *
服务器(侦听端口8000, callMe()函数调用 doWork(),永无止境。)
var dnode = require('dnode');
function doWork(cltId) {
console.log('Client:' + cltId);
setTimeout(function() { doWork(cltId); }, 5000);
}
var server = dnode({
callMe: function (cltId, cb) {
doWork(cltId);
}
});
server.listen(8000);
客户端(连接到端口8000和rpc callMe(),永不返回)
var dnode = require('dnode');
var net = require('net');
var d = dnode();
d.on('remote', function (remote) {
var cltId = 'c-' + Math.random().toString(16).slice(2);
remote.callMe(cltId , function (s) {
console.log('Result=' + n);
d.end();
});
});
var conn = net.connect(8000);
conn.pipe(d).pipe(conn);
当客户端运行时,它将挂起,但它可以被终止或超时设置结束连接。所以客户可以继续做其他事情。
但是
服务器仍然会用我们永无止境的代码快乐地甩掉...... 随着越来越多的客户连接并调用闪避代码,我们最终会得到额外的虚假僵尸,直到最终我想象所有服务器资源都被消耗掉了。
答案 0 :(得分:2)
我认为你对dnode的作用感到困惑。与dnode一起使用的函数只能在它们被定义的一侧执行。看起来好像回调在连接的另一端被序列化并执行,但它们不是。
例如,如果客户端执行:
var d = dnode({
callMe: function () { while (true) }
});
d.pipe(stream).pipe(d);
并且服务器调用callMe()
,客户端将挂起while (true)
,而不是服务器。
答案 1 :(得分:0)
您的客户端代码可以执行:
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();
});
});
(未测试!)