0

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

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

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

4

2 回答 2

2

我认为您对 dnode 的作用感到困惑。与 dnode 一起使用的函数只会在定义它们的一侧执行。看起来好像回调正在序列化并在连接的另一端执行,但事实并非如此。

例如,如果客户这样做:

var d = dnode({
  callMe: function () { while (true) }
});
d.pipe(stream).pipe(d);

和服务器调用callMe(),客户端将挂在while (true),而不是服务器上。

于 2013-03-21T01:05:07.520 回答
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();
    });
});

(未经测试!)

于 2013-08-11T11:06:08.273 回答