我们希望在需要 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);
当客户端运行时,它会挂起,但它可以被杀死或设置超时来结束连接。所以客户可以继续做其他事情。
但
服务器仍然会愉快地使用我们永无止境的代码...
随着更多的客户端连接并调用闪避代码,我们最终会得到更多的虚假僵尸,直到最终我想所有的服务器资源都被消耗掉了。