イベントソーシング、CQRS、マイクロサービスを使用するシステムを設計しています。これは珍しいパターンではないことを理解しました。このサービスの重要な機能は、記録システムから再水和/復元する機能である必要があります。マイクロサービスは、MQ(Kafka)でコマンドとクエリを生成します。他のマイクロサービスが応答します(イベント)。コマンドとクエリは、監査と復元の目的でS3に保持されます。
現在の思考プロセスは、システムを復元するために、S3からイベントログを抽出し、単純にKafkaにフィードバックできるというものでした。
しかし、これは時間の経過に伴う生産者と消費者の両方の変化を認めることができません。コマンド/クエリレベルでのバージョン管理は、問題の解決にある程度役立つようですが、復元中のコマンドが受信および処理されたときに、まったく同じになるようにコンシューマーのバージョン管理を行うことはできません。 [のバージョン]コマンドを最初に受信したときに処理を実行しているコード。
これを解決するために使用できるパターンはありますか?この機能を宣伝する他のシステムを知っている人はいますか?
編集:例を追加します。
「バイヤー」が私のオークションサイトの「セラー」に「質問」を送信します。フローは次のようになります。
UI -> Web App: POST /question {:text text :to seller-id :from user-id}
Web App -> MQ: SEND {:command send-question :args [text seller-id user-id]}
MQ -< Audit: <command + args appended to log in S3>
MQ -< Questions service: - Record question in DB
- Email seller 'You have a question'
新しいビジネス要件の結果として、私は「質問サービス」コンシューマーを調整して、すべての未読の質問の数を保持します。DBスキーマが変更されます。これまで、売り手が質問を読んだかどうかはわかりませんでした。最後の行は次のようになります:
MQ -< Questions service: - Record question in DB
- Email seller 'You have a question'
- Increment 'unread questions count'
変更前と変更後の2つのコマンドが問題です。「未読の質問数」は1です。
システムがクラッシュします。新しいコードを使用してコマンドを再生することにより、復元しました。復元の最後では、「未読の質問数」は2になります。この不自然な例では、結果は大惨事ではありませんが、復元された状態は以前の状態ではありません。