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);
クライアントが実行されるとハングしますが、強制終了されるか、接続を終了するタイムアウトが設定される可能性があります。そのため、クライアントは別のことを行うことができます。
しかし
サーバーは、終わりのないコードを楽しそうにパントし続けます...
そして、より多くのクライアントが接続して回避コードを呼び出すと、最終的にすべてのサーバーリソースが消費されると想像するまで、追加の偽のゾンビが発生します.