Jonathan Oliverからの不適切な投稿を読んだことがあります。CQRSの読み取り側での順序違反イベントの処理
http://blog.jonathanoliver.com/cqrs-out-of-sequence-messages-and-read-models/
我々が使用するソリューションは、メッセージをデキューするために、前の配列と、すべてのメッセージが 受信されるまで、「保持テーブル」に配置することです。以前のすべてのメッセージが受信されたら、 メッセージを保持テーブルから取り出し、 適切なハンドラを通して順番に実行します。 すべてのハンドラが正常に実行されると、保持テーブルからメッセージが削除され、読み取ったモデルの更新が にコミットされます。
ドメインがイベントを公開し、 に適切なシーケンス番号を付けるため、これは私たちのために機能します。これがなければ、以下の解決方法 は不可能ではないにしても、はるかに難しくなります。
このソリューションでは、永続ストレージ メカニズムとしてリレーショナルデータベースを使用していますが、 ストレージエンジンの関係性の側面は使用していません。同時に、このすべてに警告があります。 メッセージ2,3,4が届いても、メッセージ1は届かない場合は、 は適用されません。エラーメッセージ メッセージ1を処理している場合、またはメッセージ1が何らかの形で消失した場合にのみ、シナリオが発生します。幸いにも、 メッセージハンドラのエラーを修正するのは簡単で、 はメッセージを再実行します。または、メッセージが失われた場合は、 をイベントストアから直接読み込んで再構築してください。
イベントの不足をイベントストアにいつでも頼むことができるとのことについて、いくつか質問がありました。
- CQRSの書き込み側は、イベントの再生を要求する側のサービスを公開する必要がありますか。たとえば、イベント1に は受信されていませんが、2,3,4,3が受信できた場合は、イベントストアを サービスでリクエストして1から開始してイベントを再公開することができますか?
- このサービスはCQRSの書き込み側の責任ですか?
- これを使用して読み込みモデルを再構築するにはどうすればよいですか?
RabbitMqで「再試行」アプローチを使用していて、うまくいきました。何回か再試行してもそれでもうまくいかない場合は、このイベントをデッドレターキューに入れてシーケンス番号をリセットして、それ以上のイベントを正しく処理できるようにしてください。通常、アプリケーションの順序外イベントの原因は何ですか? – IlliakaillI
私は複数のイベントを生成するいくつかの特定のコマンドを持っています。私はまだ何も実装していませんが、可能性のある出来事の出来事はさまざまです。私のイベントパブリッシャーも非同期で動作します。したがって、いくつかのイベントが順番に公開されない可能性もあります。私は私のイベントのシーケンス番号に頼っています。 私はリトライを試みます。あなたがそれについて少し詳しく説明できるなら、私はそれを答えとしてマークすることができます。 –
私は私の答えのコメントのセクションでより詳しい説明を追加しました。 – IlliakaillI