🌊

「ソフトウェアアーキテクチャ・ハードパーツ」を読んでSagaパターンについて書いてみました。

2023/04/19に公開

はじめに

最近、ソフトウェアアーキテクチャ・ハードパーツ読み始め、アウトプットとして書き記します。
また内容深掘り次第追記していきます

参考書籍

ソフトウェアアーキテクチャ・ハードパーツ ―分散アーキテクチャのためのトレードオフ分析

Sagaパターンとは

一言で表すと、分散トランザクション[1]を実現するための1つのパターンのことです
Sagaパターンは、ロールバックを行うことができない代わりに補償という考え方を提供しており、ロールバックを行うことができない代わりにリクエストの内容を逆向きにした取り消し操作により、擬似的なロールバックを行います。またこのロールバック方法を補償トランザクションと言います。

ただしマイクロサービスでは不具合となる危険性があるので分散トランザクションは推奨していないっぽい。
基本的には1つのDBを使ってローカルトランザクションを実行する方が良いそうです。
なのでこれから書いていることは可能であれば避けた方が良いと思っておいてください。

また基本的に分散トランザクションは単一のデータベーストランザクションであるACID特性を持っていないです

SAGAパターンの種類

SAGAパターンは全てで8種類存在する。
これらは「通信」「整合性」「調整」のパターンを組み合わせたものです。

パターン名 通信 整合性 調整
エピックサーガ 同期 アトミック オーケストレーション
伝言ゲームサーガ 同期 アトミック コレオグラフィ
おとぎ話サーガ 同期 結果整合性 オーケストレーション
タイムトラベルサーガ 同期 結果整合性 コレオグラフィ
ファンタジーサーガ 非同期 アトミック オーケストレーション
ホラーストーリーサーガ 非同期 アトミック コレオグラフィ
パラレルサーガ 非同期 結果整合性 オーケストレーション
アンソロジーサーガ 非同期 結果整合性 コレオグラフィ

エピックサーガ(同期 アトミック オーケストレーション)

広く使われているパターン。
モノシリックなシステムの動作を模倣することができる。

メリット

  • モノシリックシステムを模倣した、トランザクション調整
  • オーケストレーターによる。明確なワークフロー所有

デメリット

  • オーケストレーターにトランザクション性を加えることによるパフォーマンス、スケール、弾力性の低下
  • オーケストレーターはトランザクションの全ての参加者が成功または失敗したことを確認しなければならず、時間的なネックを生み出す。
  • 分散トランザクションによるさまざまな障害モードや境界条件に耐えられず、さらに元に戻す操作によって、本質的な複雑さが加わる。

エピックサーガはオーケストレーションベースでトランザクションを実現する(リクエストがうまく行った例)

エラーが発生した場合、オーケストレーターは他のサービスに補償リクエスト行う

オーケストレーターは補償トランザクションを利用して、他の2つのサービスに前の操作の取り消しリクエストを行い、全体のトランザクションが始まる前の状態に戻す必要がある。

伝言ゲームサーガ(同期 アトミック コレオグラフィ)

メリット

  • エラー条件があまりないワークフローに適している
  • エピックサーガよりもオーケストレーションがないため、スケール性に若干優れている

デメリット

  • エラー条件が多くなるとオーケストレーターがないため複雑になる
  • オーケストレーションがないため、各マイクロサービスが状況を調整する必要がある

オーケストレーターがないため複雑になり、利点の多くが相殺されてしまう。
トランザクションのアトミック性を実現するために、以下の図のように、各マイクロサービスが補償トランザクションなどを利用して、巻き戻す必要がある。またそのことによりサービス間の結合度が増加する

また、最初に呼び出されたサービスが調整点となり、調整点となったサービスは、作業が終了すると、ワークフロー内の次のサービスにリクエストを渡し、ワークフローが成功するまでのやり取りを継続する。
ただし、エラーが発生した場合には、各サービスには補償リクエストを連鎖的に送り返すロジックが組み込まれていなければならない。
調整点となるコントローラはオーケストレーションと同程度に複雑になる。
オーケストレーターがないためエピックサーガよりもスケール性に若干優れている。
しかし、エラーによる巻き戻し処理が複雑になる。

おとぎ話サーガ(同期 結果整合性 オーケストレーション)

メリット

  • 結果整合性によって難しかった補償トランザクションの課題の排除
  • アトミック性がなくなることにより、サービスが一時的に停止した場合、サービスが復旧するまで変更をキャッシュすることもできる。
  • イベントベースパターンなどの信頼性の高い結果整合性のある分散トランザクションを使える

多くのマイクロサービスアーキテクチャでよく見られる、魅力的なパターン
他のパターンと比較してバランスに優れている。
オーケストレーターによって、ワークフローの管理は容易となって、結果整合性は、エラー処理での困難な調整の課題を取り除く。
最大の魅力は、全体的なトランザクションがないこと、各マイクロサービスは独自のトランザクション動作を管理し、ワークフロー全体では、結果整合性に依存している。

オーケストレーターは複雑なワークフローを管理する必要があるが、トランザクション内で行うという制約はない

アトミック性を実現するという難しい要件が緩和され、システムを設計する際の選択肢が多くなる。
例えば、サービスが一時的に停止した場合、結果整合性により、サービスが復旧するまで変更をキャッシュできる

タイムトラベルサーガ(同期 結果整合性 コレオグラフィ)

参加しているサービスにワークフローの全責任を完全に負わせる形を取る。
ワークフローの複雑さとオーケストレーターの有用性には直接的な相関関係があるため、このパターンはシンプルなワークフローに最適

ワークフローが複雑であればコレオグラフィは難しい

非同期性があればスケーラビリティと弾力性が優れたものになる。(アンソロジーサーガ)

ファンタジーサーガ(非同期 アトミック オーケストレーション)

実装しにくい組み合わせの一つ(基本的に非同期+アトミックの組み合わせは困難)
非同期通信はアーキテクチャに何層もの複雑さをもたらし、特に調整に関して、オーケストレーターにさらに多くの複雑さを要求する。
オーケストレーターのワークフローが非同期に行われると、非同期なトランザクションの状態が存在することになり、順序性がなくなり、デッドロックやレースコンディション[2]のような並列システムの課題が発生する可能性がある。

全てが非同期なので、例えばワークフローAが始まったとして、そのAが保留されている間にワークフローBが始まる。そしてそのBが保留中のAの結果に依存しているとすれば、この動作をモデル化するのは至難。
より良い選択肢は通常パラレルサーガ

  • ファンタジーサーガは、非同期通信のためにアトミックのトランザクション調整が困難であるため、現実的ではない

ホラーストーリーサーガ(非同期 アトミック コレオグラフィ)

最悪の組み合わせのパターン
なぜかというと、整合性による最も厳しいアトミックと、最も緩い結合スタイル(非同期とコレオグラフィ)の組み合わせだから。
非同期通信を使用しているにもかかわらず、複数のサービス間でトランザクションの整合性を管理するためのオーケストレーターが存在しない。そのため、各サービスは保留されている複数のトランザクションに対する取り消し情報を追跡する必要があるが、非同期性のために順番が狂ってしまう可能性がある。
例えば、トランザクションAが開始され、保留中にトランザクションBが開始されたとする。
するとコレオグラフィベースのサービスはイベント発火の順番を守り、エラーが起きた場合、複雑な条件でロールバックしなければならない

より良い選択肢はアンソロジーサーガ

最も困難な組み合わせで非同期でありながらトランザクションを実現し、かつコレオグラフィーである

パラレルサーガ(非同期 結果整合性 オーケストレーション)

エピックサーガパターンをベースにしているが、非同期通信と結果整合性という制約を緩和する2つの違いがある。
このパターンはオーケストレーターを使用するため、複雑なワークフローに適している。
また、非同期通信を使用するため、応答性が良く、並列実行が可能となっている。さらに整合性は各マイクロサービスによって担保される。サービス間でデータの同期が必要なるが、これはバックグラウンドで行われるか、オーケストレーターを介して行われる。
例えば、ワークフローの実行中にエラーが発生した場合は、オーケストレーターは関係する各サービスに非同期でメッセージを送り、失敗した変更の保証を行える。ただし、失敗の補償には再試行やデータ同期、その他多くの修復を伴う。

デメリットとして、トランザクションせいの欠如は、エラーやその他のワークフローの問題を解決するために、オーケストレーターに多くの負担を強いる。
また、非同期通信は応答性が良い反面、タイミングや同期の問題を解決するのが難しく、レースコンディション、デッドロック、キューの信頼性などの問題がある。

各サービスは独自のトランザクションを持ち、オーケストレーターはリクエストとレスポンスを調整する。

アンソロジーサーガ(非同期 結果整合性 コレオグラフィ)

エピックサーガのパターンとは正反対の特徴を持っている。(非同期通信、結果整合性、コレオグラフィ)
このパターンは非常に高いスループットの通信で、単純なエラー状態が、少ない場合に適している。
図ではメッセージキューを使用して、オーケストレータなしで他のドメインサービスに非同期メッセージを送信する

オーケストレーターの欠如、結果整合性、非同期性により、このパターンは高度に分離されているが、調整が困難である。

オーケストレーションとコレオグラフィのトレードオフ

オーケストレーション通信

メリット デメリット
ワークフローの一元化 応答性
エラー処理 耐障害性
回復性 スケーラビリティ
状態管理 サービス紹介

コレオグラフィ通信

メリット デメリット
応答性 分散ワークフロー
スケーラビリティ 状態管理
耐障害性 エラーハンドリング
サービス分離 回復性

ワークフローの複雑さが増すほどに、オーケストレーターの有用性が高くなる。

脚注
  1. 分散トランザクションとは、マイクロサービス間の複雑なトランザクション処理を行うことができる手法のこと。 ↩︎

  2. レースコンディションとは、複数の処理が同じデータに同時にアクセスした場合に、機能停止など予期しない処理結果が生じてしまうこと。 ↩︎

Discussion