概要
- Java読書会でせっかく勉強したのにつぎつぎと忘れていくので、印象に残ったところを記録していく
6章 イベントソーシングを使ったビジネスロジックの開発
モデリングした結果を反映したテーブルを作るのではなく、エンティティに対する生成・更新イベントをDBに記録していくという話
https://microservices.io/patterns/data/event-sourcing.html
従来のアプローチ
- やり方
- なんらかモデリング
- 対応するクラスを作る
- 対応するテーブル作る
- ORマッパーでテーブルとクラスをつなぐ
- 欠点
- 履歴が残らない
- 後付で履歴つくるのは大変
- 生成・更新イベントも後付
イベントソーシング
- やり方
- モデリングはする
- 対応するクラスは作る
- でも永続化するのは、生成・更新イベントのみ(永続化用のテーブルをイベントストアと呼ぶ)
- デシリアライズは、空オブジェクトにイベント履歴を繰り返し適用する
- 場合によっては、スナップショットテーブルを用意して、高速化する
- イベントの発行は、イベントテーブルのトランザクションログを見るなり、ポーリングするなりして発行する
- 利点
- 履歴ファーストなので、当然すべての履歴が残る
- イベント発行もネイティブに対応
- 欠点
- イベントや対象となるオブジェクトのスキーマに追随するのが大変
- 従来手法とあまりに違いすぎるので習得難易度が高すぎる
- 履歴が残る分、削除が苦手
- 履歴しかないので、検索が困難⇒これは7章のCQRSで説明されている検索専用サービスを建てることで解決する
実現手段
基本的に作者の作成したEventuateフレームワークシリーズを使う
- Eventuate Local
- イベントストアの実装用ライブラリ
- イベントの永続化はMySQL、イベントのパブリッシュはKafkaベース
- スナップショット機能もあり
- Eventuage Client
- Eventuate Localを基盤として、サービスを実装するためのライブラリ
- Eventuate Tram Saga
- Sagaを実現するためのライブラリ
- Sagaは4章で説明されている。マイクロサービスだとサービスをまたがるところはトランザクションが効かないので、変わりにSagaと呼ばれるものを作る
感想
- 難しくてついていけません。
- 概要レベルなら分かるのですが。
- Eventuateシリーズをよほど使いこなせないと実現できなさそう
- ピットフォールになる部分をよくしっているか
- トラブル時にどうデバッグするか?
- 6章、7章を合わせて読んでみると、マイクロサービスはイベントを発行するのが当たり前なのか?
- 世の中のマイクロサービス開発というのは本当にこの本に書いてあるようなことをやっているのか?それとも2、3種類程度のWebアプリがコンテナ化されて動いているだけでモノリシックアプリと大差ないのか?