我们希望在需要RPC功能的项目中使用NodeJs DNode (https://github.com/substack/dnode)。它已经建立和测试,似乎是一个很好的适合该项目。
不过还是有个小麻烦。远程函数可以是用户定义的,因此我们将无法控制逻辑。这意味着函数可能编写得很糟糕,执行时间过长,甚至可能永远也不会完成(无穷无尽的循环)。
所以问题:有没有一种方法可以在产生的服务器连接/调用上实现超时检查/事件/触发器。
例如,如果函数的执行时间超过5秒,则中止它并将异常信息返回给客户端。
注意:我们已经在客户机上实现了超时逻辑,所以这不是一个问题。只是不想让虚假的僵尸进程无缘无故地阻塞服务器组件。
编辑: *--添加代码示例--*
Server (监听端口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);Client (连接到端口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);当客户端运行时,它将挂起,但它可以被终止,也可以是结束连接的超时集。这样客户就可以继续做其他的事情了。
但
服务器仍然会高兴地抛出我们永无休止的代码..。
随着更多的客户端连接并调用道奇代码,我们最终会有更多的虚假僵尸,直到最终我可以想象所有的服务器资源都被消耗了。
发布于 2013-03-21 01:05:07
我想你对dnode做什么感到困惑。与dnode一起使用的函数只在定义的侧执行。看起来,回调似乎在连接的另一端被序列化和执行,但它们没有。
例如,如果客户端这样做:
var d = dnode({
callMe: function () { while (true) }
});
d.pipe(stream).pipe(d);服务器调用callMe(),客户端将挂在while (true)上,而不是服务器上。
发布于 2013-08-11 11:06:08
您的客户端代码可以:
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();
});
});(未经测试!)
https://stackoverflow.com/questions/15521897
复制相似问题