DNode服务器方法超时

时间:2013-03-20 11:12:07

标签: node.js dnode

我们希望在需要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);

当客户端运行时,它将挂起,但它可以被终止或超时设置结束连接。所以客户可以继续做其他事情。

但是

服务器仍然会用我们永无止境的代码快乐地甩掉...... 随着越来越多的客户连接并调用闪避代码,我们最终会得到额外的虚假僵尸,直到最终我想象所有服务器资源都被消耗掉了。

2 个答案:

答案 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();
    });
});

(未测试!)