Saga Pattern
分散システムにおいて現れる分散トランザクションの問題への1つの対応
マイクロサービス特有というわけではない
常にトランザクションの整合性を維持しようと努力する代わりに、アプリケーションで最終的な結果整合性を実装する
サービス毎にローカルのトランザクションを実行し、ロールバックはCompensating Transactionで行う
トランザクションは3種類に分類され、Go/No Goの境界を決める
Compensating Transaction
ロールバックができる
元の操作内のステップの影響を元に戻す
Pivot Transaction
2つの間で、超えたら進むしかない
Retriable Transaction
成功するまでリトライができる
Compensating Transactionを実行する契機
Sagaパターンによるオーケストレーションのアプローチでは、コーディネーターサービスが、Sagaの意思決定とビジネスロジックの順序付けを集中化する
各サービスに何をすべきか、いつ行うのかをコントロールするコーディネーター(サガオーケストレーター)を定義し、サガオーケストレーターは、どのサービスを実行すべきかをメッセージキューのイベント/戻りイベントで各サービスと通信する
コーディネーター各サービスへの要求にはRESTの場合もある
処理結果は、MQの戻りイベントで待ち受けます。
課題
ローカルトランザクションの結果が他サービスに見えてしまう
対策: CQRSで参照用DBに対して一番最後に書き込みを行う
参考
https://docs.microsoft.com/ja-jp/azure/architecture/patterns/compensating-transaction
https://qiita.com/nk2/items/d9e9a220190549107282
https://speakerdeck.com/tzkoba/li-jie-sitekuo-gerufen-san-sisutemufalseji-chu-zhi-shi