Saga
マイクロサービスのように個々にDBを有する複数のサービスをまたいだACDトランザクションを保証できる。[カウンターメジャー]によって、[分離性](独立性)がないことによる並行処理の異常の影響を防ぐ必要がある。
コーディネート
サーガのステップ通りに動かすコーディネートコードが参加サービスのトランザクションの実行指示をする。コーディネートコードの実装方法には以下の2種類の方法がある。
コレオグラフィ
サーガの参加サービスに次のステップの判断を委ねる分散管理の方法。参加サービスはイベントを交換して通信をおこなう。
問題点
- 参加サービスはトランザクションの一部としてイベントをパブリッシュする必要がある
- データベースの更新とイベントのパブリッシュをアトミックに行う必要がある
- Transactional messagingパターンを利用する
- 参加サービスは受け取ったイベントを自分のデータに対応付ける必要がある
- 相関IDを含めたかたちでイベントをパブリッシュするようにする
メリット
- 単純性:サービスはオブジェクトを作成、更新、削除したときにイベントをパブリッシュする
- 疎結合:イベントをサブスクライブするだけで、お互いについて直接的な知識をもたない
デメリット
- サーガを定義しているコードがまとまっていないため、わかりづらい
- 循環的な依存関係が発生する可能性がある
- サービスが密結合になる可能性がある
オーケストレーション
サーガオーケストレートクラスでコーディネートロジックを一元管理する方法。起動の起点となるサービスでオーケストレータを作成し、サーガのステップを管理する。
参加サービスと通信を行い、サーガのステップを実行するために参加サービスにコマンドメッセージを送る。
オーケストレータを作成したサービスへのコマンドも参加サービスの1つとしてコマンドメッセージを経由して処理する。
メリット
- コレオグラフィに比べて循環依存がないため依存関係が単純
- コレオグラフィよりも疎結合。参加サービスがパブリッシュイベントについて知識が不要になる
- コーディネートのロジックがオーケストレタにまとめられるため、ドメインがサーガについての知識をもつ必要がなくなる
デメリット
- オーケストレタにビジネスロジックが集中してしまう可能性がある。ファット
オーケストレーションのモデリング
状態マシンでモデリングすることで、状態とアクションを紐付けられるため、設計・実装・テストが簡単になる。