複数の競合するコンシューマーが分散しており、それぞれが同じ (トランザクション) キューからメッセージを引き出しています。各コンシューマをべき等レシーバとして実装したいので、重複が到着した場合でも、同じメッセージを (すべてのコンシューマにわたって) 2 回以上処理することはありません。複数のコンシューマーでこれを達成するにはどうすればよいですか?
私が最初に考えたのは、各メッセージをキューに入れる前に何らかの方法で連続したシーケンス番号を生成し、共有データベース テーブルを使用してコンシューマー間の作業を調整することです。つまり、consumer#1 は msg#1 を処理し、DB テーブルに「msg#1 が処理されました」という行を書き込みます (耐久性を確保するためにデータベースに入れたい)。コンシューマーは、メッセージを処理する準備ができると、キューで次に使用可能なメッセージを調べ、共有 DB テーブルを調べて、これが次のメッセージであるかどうかを判断します。もしそうなら、それはキューから外されます。そうでない場合、それは無視されます。
このように、処理された最後のメッセージを保存するだけでよく (すべてのメッセージに連続したシーケンス番号があるため)、ネゴシエートされた「ウィンドウ」サイズで受信したすべてのメッセージの ID を保存するバッファーを使用する必要はありません。メッセージは常にシリアルに処理されます (これは、このシナリオで必要なことです)。
より良い方法があるかどうかだけ知りたいですか?メッセージを処理する必要があるときはいつでも、データベースにクエリを実行するコストが心配です。
答えが「フレームワークに依存する」である場合、MSMQ を念頭に置いていました