0

今日、この質問を受けましたが、その答えはチーム内で意見が分かれているようです。

シナリオ 特定のトピックに関するイベント (メッセージ) を (EasyNetQ 経由で) RabbitMQ に送信する複数のパブリッシャーがいます。彼らはFIFOを保証すると言いました。彼らは、「トピック」のメッセージを順番に「処理」することを保証するシステムを構築したいと考えています。

私の解決策 トピックごとに「バージョン番号」を保持するキャッシュを用意し、シーケンスが一致しなかった場合はメッセージの処理を保留します。最初のイベント処理が完了し、キャッシュが新しいターゲット バージョンに更新された後、メッセージの処理を再試行できます (時間遅延再試行)。これは、コンシューマーが基本的に別のコンシューマーが処理を完了するのを待っていることを意味します。これは、一種のロックであるため、数秒ではなく数ミリ秒かかるものに対して機能します。

あるいは、このhttp://blog.jonathanoliver.com/cqrs-out-of-sequence-messages-and-read-models/のように、順不同のイベントの保持テーブルを実装できると言いました

問題を提起した人は、それらの答えは両方とも間違っていると言いました.

彼らが言った解決策は、ルーティングキーと直接交換を使用し、トピックを常に同じコンシューマーに送ることでした。スティッキー負荷分散システムのようなものです。任意の時点でのコンシューマーの数に応じて交換/バインディングを更新する必要があるため、これによりシステムのオンデマンドのスケーラビリティが制限されることを指摘しました。

以前にこのパターンを実装したことがある人の意見を聞きたいです。ここには正しい解決策と間違った解決策がありますか?それとも、処理の遅延やスケーラビリティなどに基づいて正しい戦略を選択するケースですか?

編集:明確にするために。どのソリューションが自分の状況により適しているかを判断するために、各アプローチの長所と短所を見つけることを期待しています。落とし穴などはありますか?

4

1 に答える 1

0

ここに正しい解決策と間違った解決策がありますか

番号

処理の遅延やスケーラビリティなどに基づいて適切な戦略を選択する場合ですか?

はい

これは、stackoverflow で非常に頻繁に尋ねられる質問であり、Web 上のブログ投稿で頻繁に回答されています。

誰かが尋ねるたびに、少なくとも 2 つの異なる答えがあります。それらのどれも「正しい」または「間違っている」わけではありませんが、コンテキストに基づいて、特定の状況により適しています。

于 2016-12-08T22:32:05.993 に答える