首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DNode服务器方法超时

DNode服务器方法超时
EN

Stack Overflow用户
提问于 2013-03-20 11:12:06
回答 2查看 263关注 0票数 0

我们希望在需要RPC功能的项目中使用NodeJs DNode (https://github.com/substack/dnode)。它已经建立和测试,似乎是一个很好的适合该项目。

不过还是有个小麻烦。远程函数可以是用户定义的,因此我们将无法控制逻辑。这意味着函数可能编写得很糟糕,执行时间过长,甚至可能永远也不会完成(无穷无尽的循环)。

所以问题:有没有一种方法可以在产生的服务器连接/调用上实现超时检查/事件/触发器。

例如,如果函数的执行时间超过5秒,则中止它并将异常信息返回给客户端。

注意:我们已经在客户机上实现了超时逻辑,所以这不是一个问题。只是不想让虚假的僵尸进程无缘无故地阻塞服务器组件。

编辑: *--添加代码示例--*

Server (监听端口8000,callMe()函数调用doWork(),永不结束)。

代码语言:javascript
复制
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(),它永远不会返回)

代码语言:javascript
复制
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);

当客户端运行时,它将挂起,但它可以被终止,也可以是结束连接的超时集。这样客户就可以继续做其他的事情了。

服务器仍然会高兴地抛出我们永无休止的代码..。

随着更多的客户端连接并调用道奇代码,我们最终会有更多的虚假僵尸,直到最终我可以想象所有的服务器资源都被消耗了。

EN

回答 2

Stack Overflow用户

发布于 2013-03-21 01:05:07

我想你对dnode做什么感到困惑。与dnode一起使用的函数只在定义的侧执行。看起来,回调似乎在连接的另一端被序列化和执行,但它们没有。

例如,如果客户端这样做:

代码语言:javascript
复制
var d = dnode({
  callMe: function () { while (true) }
});
d.pipe(stream).pipe(d);

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

票数 2
EN

Stack Overflow用户

发布于 2013-08-11 11:06:08

您的客户端代码可以:

代码语言:javascript
复制
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();
    });
});

(未经测试!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15521897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档