このプログラムの基本的な流れは、UDP パケットを受信し、それらに関する情報を検索し、さらに処理するために送信することです。情報は現在mongodbに保存されています。
疑似 JS は次のようなものです。
socket.on('message', function(message) {
mongo.lookup(message, function(err, object) {
furtherProcessing(object);
});
});
このフローで奇妙な/迷惑な動作に気付きました。
mongodb は非同期であるため、ルックアップが応答するのを待っている間に、プログラム フローが次のパケットに切り替わることがわかりました。これは、多数のパケットが到着した場合、複数の mongodb リクエストがインターリーブされる可能性があることを意味します (つまり、プログラムは複数のパケットのコールバックを待機しています)。残念ながら、mongo からの応答はランダムな順序 (またはおそらく mongo によって満たされる順序) であるように見えます。つまり、オブジェクトがfurtherProcessing
関数に渡されるまでに、順序が変更される可能性があります。
非同期リクエストで FIFO の順序付けを強制する方法はありますか? つまり、送信されたすべてのオブジェクトfutherProcessing
がソケットから受信された順序と同じであることを保証する方法はありますか?