イベント駆動アーキテクチャ導入の手引きと共通の落とし穴
GMO成瀬さんによるスライド。
JJUG CCC 2024 springのスライドのようだ。
CQRSとEventSourcingについて、いつも紹介してくれている内容から踏み込んで、よくある問題やその対応(ロールバック)に言及している。
よくある問題まとめ
トランザクションはどこまで?
イベントを発行した先まで含めるか否か
メッセージブローカーとの整合性
イベント送出をなかったことにするにはどうすればいいか
メッセージ処理の順序
メッセージブローカーがもたらす順序の入れ替わり
リプレイのパフォーマンス問題
イベントソーシングオブジェクト特有のパフォーマンス問題対処
イベントデータの型改修
クラスのフィールド名などの変更でデシリアライズエラー
分散した個人情報
特定のテーブルに個人情報がまとまってないので完全削除できない
疎結合すぎる
制御の流れが追いづらい
トランザクションはどこまで? → 補償トランザクション
左の列が正常系の流れ。
流れの途中でエラーが起きたときは、発生個所に応じた右の列に遷移して流れを遡ってキャンセルする。
https://scrapbox.io/files/66d41af45aa422001c254a51.png
メッセージブローカーとの整合性 → Outboxパターン
https://scrapbox.io/files/66d41af45aa422001c254a5a.png
https://scrapbox.io/files/66d41af55aa422001c254a64.png
メッセージ処理の順序 → 順序保証が必要なメッセージは同じパーティションで
https://scrapbox.io/files/66d41af55aa422001c254a6a.png
あるいは、コンピューティングリソース側で順序保証することも考えられる。
https://scrapbox.io/files/66d41af65aa422001c254a7a.png
リプレイのパフォーマンス問題 → Snapshot取得
過去データが増大すると、現在の状態を作るためのApply処理回数が増大する。
ので、Snapshotを取得する
https://scrapbox.io/files/66d41af65aa422001c254a85.png
https://scrapbox.io/files/66d41af75aa422001c254a91.png
その他の問題
イベントデータの型を改修するには
イベントアップキャスター(よくわからん)
分散した個人情報を削除するには
「退会した」というイベントに対応するコマンドを各所が用意する
削除のキーになり得る一意なIDを付与しておくと良い
文字コードに注意
疎結合すぎて制御のフローを追うのにコードを読まねばならん
IDEのプラグインにあるそうだが、、それいつもの推しフレームワークの機能のような