私は、Node.js でサービスを作成している人々がある時点で遭遇する、古典的な非同期/同時実行の問題を抱えています。リクエストに応じて RDBM からデータをフェッチし、行のフェッチが完了する とfin
( を使用して) イベントを発行するオブジェクトがあります。EventEmitter
ご想像のとおり、サービスの呼び出し元がほぼ同時にいくつかの呼び出しを行うと、行は予測できない順序で返されます。このfin
イベントは、行を生成した要求についての呼び出し関数の理解に対応しない行に対して発生します。
これが私が行っていることです(関連性のために簡略化されています):
var mdl = require('model.js');
dispatchGet: function(req, res, sec, params) {
var guid = umc.genGUID(36);
mdl.init(this.modelMap[sec], guid);
// mdl.load() creates returns a 'new events.EventEmitter()'
mdl.load(...).once('fin',
function() {
res.write(...);
res.end();
});
}
簡単なテストでは、mdl.guid
が に対応しないことがよくありguid
ます。
new events.EventEmitter()
関数内に作成すると、リクエストごとにmdl.load()
個別に作成することでこの問題を解決できると思っていましたが、明らかにそうではありません。EventEmitter
に関係なく、他のオブジェクトと同じオブジェクト永続化のルールが適用されると思いますnew
。
私はバックグラウンドで C プログラマーです。循環キューまたはハッシュ スキームを使用して、これらの応答を要求に関連付けるための独自のスキームを考え出すことができます。ただし、この問題はすでに何度も解決されていると思います。私の調査では、これをどのように処理するのが最善かについて多くの意見が明らかになりました。さまざまな種類のキューイングの実装Futures
などです。
私が疑問に思っているのは、ここで適切な非同期フロー制御への最も簡単なアプローチは何ですか? 必要がなければ、依存関係の大規模なパラダイムシフトに深く入り込みたくありません。どのサードパーティ製モジュールが最適かについて、比較的単純で、標準的で、決定的な解決策、および/または広く普及しているコンセンサスはありますか?