0

RPC 機能が必要なプロジェクトでNodeJs DNode ( https://github.com/substack/dnode ) を使用しようとしています。セットアップとテストが行​​われており、プロジェクトに適しているようです。

しかし、1つの小さなニグル。リモート関数はユーザーが定義できるため、ロジックを制御することはできません。これは、関数が正しく記述されておらず、実行に時間がかかりすぎたり、完了しない (無限ループ) 可能性があることを意味します。

質問:生成されたサーバー接続/呼び出しにタイムアウトチェック/イベント/トリガーを実装する方法はありますか?
例: 関数の実行時間が 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 に答える