Sagaパターンは、ある操作をサポートするために複数のマイクロサービスで一連のステップを実行しなければならない場合に最適なパターンだ。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Sagaパターンは、ソフトウェアアーキテクチャのスタイルの一つであり、ステップごとに実行される分散タスクを、フェイルセーフな方法で管理することを目的としている。Sagaパターンは、マイクロサービス指向アーキテクチャ(MOA)に適している。
MOAで構成される各サービスは、自己完結型で独立しており、それぞれが独自のロジックとデータを保持する。
マイクロサービスは通常、メッセージングフレームワークを通じてデータが共有される。Sagaパターンでは、各ステップが特定のマイクロサービスに対応する。Sagaパターンの主なメリットは、各ステップを順に追っていき、問題が発生した場合には、決められた方法で対処する「補償トランザクション」にある。あるステップで何らかの問題が発生した場合、ワークフローを最後の適切な状態に戻すよう補償トランザクションが実行される。
Sagaパターンのステップはカプセル化されている。そのため開発者はステップごとに専用の補償トランザクションを作成するのが一般的だ。マイクロサービス上で補償トランザクションが直接組み込まれることも、外部の補償トランザクションとマイクロサービスを関連付ける形で組み込まれることもある。
Sagaパターンは、いずれかのステップで障害が発生した場合にワークフロー全体をリセットしなければならないビジネスワークフローに適している。その典型的な使用例が、注文処理ワークフローやサプライチェーン管理システムだ。
例えば、旅行客のために航空会社、ホテル、レンタカーを予約する旅行代理店があるとする。この代理店には従うべきルールがある。いずれかを予約できなかった場合、それまでの予約をキャンセルし、旅行自体をキャンセルしなければならないというルールだ。つまり、航空会社、ホテル、レンタカーの順に予約する場合、レンタカーを予約できなかったら、航空会社とホテルの予約もキャンセルしなければならない。ホテルを予約できなかったら、航空会社の予約をキャンセルし、レンタカーの予約は実行されない。
Sagaパターンの実装には、オーケストレーションとコレオグラフィという2つのアプローチがある。ここからは、この2つのアプローチを詳しく見ていく。
Sagaパターンでオーケストレーションを利用する場合、1つのシーケンス内の各ステップと補償トランザクションを中央のコントローラーが管理する。シーケンス内の最初のステップが正常に行われると、コントローラーは次のステップを実行する。ステップ実行中に問題があれば、コントローラーは失敗したステップの補償トランザクションを実行する。幾つかステップを終了した後で問題が発生した場合、コントローラーはシーケンス自体を終了し、問題が発生したステップの補償トランザクションと、それ以前の全ステップの補償トランザクションを実行する。
Sagaパターンでコレオグラフィを利用する場合、中央のコントローラーはなく、各ステップが独立して動作する。各ステップがシーケンス内の後続のステップを認識し、完了時に次のステップを呼び出す。呼び出し先のステップで問題が発生すると、呼び出し先のステップが補償トランザクションを実行し、エラーとして返す。そのエラーを呼び出し元のステップが認識すると補償トランザクションが実行される。シーケンス内のそれ以前のステップが全て逆順に連鎖して各ステップの補償トランザクションが実行される。
コレオグラフィの場合、管理が難しくなる可能性もある。オーケストレーションによるアプローチでは、ステップのシーケンスがコントローラー内で明白になる。だが、コレオグラフィによるアプローチでは、次のステップが各ステップのコード内に隠されている。そのため、変更を加えるには、開発者がシーケンス全体を把握するために調査する必要がある。
Sagaパターン自体は、適切にカプセル化され独立したサービス同士が相互に連携動作するアクターモデル(actor model)などの他のデザインパターンとの互換性も非常に高い。
ビジネスワークフローのプログラミングを必要とする商用ソフトウェアを開発する機会は多く、ワークフローなしで現代のビジネスを遂行するのは難しい。ワークフローが重要であっても、その作成は非常に難しく、管理するのも困難だ。
Sagaパターンは、ワークフローの作成と管理を容易にするための青写真を開発者に提供する。有用なビジネスワークフローをコードで作成するのは依然重要な作業であり、一からワークフローを設計するよりはるかに容易だろう。
Copyright © ITmedia, Inc. All Rights Reserved.