CQRSアプリケーションでEvent Sourcingを使用しないので、私は読み取りストアを更新できるシンプルなイベントログを導入しました。イベントソースなしのCQRS:イベントログのエラー処理
これは私のアプリケーションへの状態変化は、2つのアクションで構成されていることを意味します例えば、書き込みモデル状態を更新
- SQLのINSERT
- 両方が操作を1つのアトミック操作として発生する必要があり、書き込み
イベントログにイベントを挿入します。残念ながら、イベントログは別のデータベースに存在するため、分散トランザクションについて考える必要があります。
ほとんどのCQRSサンプルはサガパターンを扱っており、すべてイベントソーシングを利用しているように見えるので、作業がはるかに簡単になります。
私の問題は、「半完成」の状態変更です。
SQLTransaction.Commit(); // if this fails, all is fine. Nothing to revert
try
{
EventLog.Insert(event);
}
catch(Exception ex)
{
// Try to undo the SQL stuff.
CompensatingSQLTransaction().Commit();
// uh-oh! The commit fails!!
// What now? Do a Retry?
}
を助けることができる任意の概念があります。
- SQL挿入は
- イベントログの挿入は、私は補償SQL操作(擬似コード)を思い付くことができ
を失敗した成功します私は出る? 私が読ん-データベースを同期外れを防ぐために、次のシナリオについて考え:
- 読み取り側の複製はその後、未処理のイベント(例えば40を受信し、検出された場合、各イベントは、シーケンス番号
- を持っています42)、イベントログにイベント41を照会します。
- イベント41が利用できない場合、システムは誰かが注意を喚起するまでイベントの複製を停止します。
これは、手動によるメンテナンスが必要ですが、読み取りdbの同期が外れないようにします。
実生活体験はありますか?
システムはどのように分散されていますか?どのように弾力性/スケーラビリティを望みますか? –
月に約10億〜2,000万件のイベントを処理できるはずです。バスシステムによって接続されたコマンドおよび/またはイベントを処理する複数のノードを利用することができなければならない。したがって、イベント複製は複数のノードで発生する可能性があります。 – mbnx