【问题标题】:DNode server method timeoutDNode 服务器方法超时
【发布时间】:2013-03-20 11:12:06
【问题描述】:

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

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

但是

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

【问题讨论】:

    标签: node.js dnode


    【解决方案1】:

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

    例如,如果客户这样做:

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

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

    【讨论】:

    • 是的,不明白。我的理解是您已经定义了客户端将调用的服务器代码。我用一个简单的客户端/服务器示例更新了我的问题,试图帮助澄清。
    【解决方案2】:

    您的客户端代码可以这样做:

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

    (未经测试!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2021-12-27
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多