Sagaパターン:分散処理の難題を解決

デジタル化を知りたい
先生、「サガパターン」って最近よく聞くんですけど、どういうものか教えていただけますか?

デジタル化研究家
そうだね。「サガパターン」とは、大きな仕事を細かい作業に分割して、それぞれの作業を順番に実行していくように組み立て、もし途中で失敗した作業があったら、その作業を元に戻す仕組みのことだよ。例えば、旅行の予約で、飛行機とホテルとレンタカーを別々に予約するケースを考えてみよう。

デジタル化を知りたい
なるほど。それぞれの予約が、細かい作業に分割された状態ですね。もし、レンタカーの予約ができなかった場合は、どのように対処するのでしょうか?

デジタル化研究家
その場合、すでに予約済みの飛行機とホテルの予約をキャンセルする処理を実行するんだ。つまり、レンタカーの予約という作業が失敗したので、それ以前に行った作業を元に戻す、という流れだね。これがサガパターンの基本的な考え方だよ。
Sagaパターンとは。
複数のシステムや小さなサービスを組み合わせた仕組みで、全体として一貫した処理を行うための手順、『物語のように順番に処理を進めるやり方』について
はじめに

近年の計算機技術の進歩は目覚ましく、仕組作りも大きく変わってきました。一枚岩のような巨大な仕組を作るのではなく、小さな仕組をたくさん作って、それらを連携させる方法が主流になりつつあります。これは、例えるなら、大きな一つの工場ですべてを作るのではなく、小さな工場をたくさん作って、それぞれが得意な部品を作り、最後にそれらを組み合わせて製品を作るようなものです。このような、分散した仕組を連携させる方法は、柔軟性や拡張性が高いという利点があります。しかし、それぞれの小さな仕組が独立して情報を持ち、処理を行うため、全体として情報の整合性を保つことが難しくなります。
複数の工場で部品を作り、最後に組み立てることを想像してみてください。ある工場で部品を作るのに失敗したら、他の工場で作った部品はどうなるでしょうか?全体の製品は完成しません。仕組も同じで、複数の仕組にまたがる処理において、すべてが成功するか、すべてが失敗する、といった一貫性を保証することが重要です。この一貫性を保つことは、分散した仕組では容易ではありません。
そこで、分散した仕組で情報の整合性を保つ方法として、「物語」を意味する「サガ」と呼ばれる方法が注目されています。サガとは、複雑な処理を小さな手順に分割し、それぞれの小さな手順を独立した仕組で実行することで、全体としての整合性を確保する仕組みです。それぞれの小さな手順は、成功したら次の手順に進み、失敗したら、それまでの手順を巻き戻す処理を行います。全体を小さな手順に分割することで、それぞれの仕組は独立性を保ちつつ、全体としての一貫性を確保できます。これは、各工場で部品を作りながら、同時に他の工場の状態も確認し、問題があればすぐに対応するようなものです。サガを使うことで、柔軟性と拡張性を保ちながら、複雑な処理の整合性を保証できるようになります。この資料では、サガの仕組みや利点、欠点について詳しく説明します。
| 従来のシステム | 新しいシステム | 課題 | 解決策 |
|---|---|---|---|
| 一枚岩の巨大な仕組み | 小さな仕組みを連携 | 情報の整合性を保つことが難しい | サガ |
| 大きな一つの工場ですべてを作る | 小さな工場をたくさん作って得意な部品を作り、最後に組み合わせる | 部品作成に失敗した場合、他の部品はどうなるか? | 複数の仕組にまたがる処理の一貫性を保証 |
| – | 分散した仕組み | 一貫性を保つことが容易ではない | サガ |
| – | – | – | 複雑な処理を小さな手順に分割、各手順を独立した仕組で実行 |
| – | – | – | 手順の成功/失敗に応じて次の手順/巻き戻し |
| – | – | – | 柔軟性と拡張性を保ちながら複雑な処理の整合性を保証 |
Sagaパターンの仕組み

「物語」を意味するサーガパターンとは、複数の作業をまとめて一つの大きな作業として扱うための方法です。この方法は、それぞれの作業を独立した小さな作業に分け、それらを順番に実行していきます。それぞれの小さな作業は、それぞれが担当する場所で実行され、自分の管理する情報を更新します。もし、途中でどれかの作業がうまくいかなかった場合は、それまでに完了した作業を元に戻すための別の作業が実行されます。この元に戻す作業のおかげで、全体の情報の整合性が保たれます。
例えば、インターネット上の店で買い物をするときを考えてみましょう。注文を受け付ける、在庫を確認する、お金を払う、商品を届けるといった一連の流れを、それぞれ小さな作業として考えることができます。もし、お金を払う段階で問題が起きた場合、注文の受付と在庫の確認を取り消す作業が実行され、情報の状態が正しく保たれます。
サーガパターンには、大きく分けて二つの種類があります。一つは、順番に作業を進めていく中で、もしどれかの作業が失敗したら、それまでの作業を逆の順番で取り消していく方法です。これは「振り付け型」と呼ばれ、それぞれの作業が、次の作業や前の作業を元に戻す作業を指示します。まるで、踊りの振り付けのように、それぞれの作業が何をすべきかを理解しているため、全体を管理する人が必要ありません。
もう一つは、全体の作業を監督する人がいて、その人がそれぞれの作業に指示を出す方法です。これは「調整型」と呼ばれ、監督役がそれぞれの作業の実行や、失敗した場合の取り消し作業を指示します。この方法では、監督役が全体の状況を把握しているので、より複雑な作業の流れにも対応できます。
このように、サーガパターンは複雑な作業を小さな作業に分割し、順番に実行することで、全体の整合性を保ちます。特に、インターネットを介して複数の場所で作業を行うシステムにおいて、サーガパターンは情報の整合性を維持するための重要な方法となっています。
| 項目 | 説明 |
|---|---|
| サーガパターン | 複数の作業をまとめて一つの大きな作業として扱う方法。それぞれの作業を独立した小さな作業に分け、順番に実行。作業が失敗した場合は、完了した作業を元に戻す。 |
| サーガパターンの種類 | 振り付け型と調整型 |
| 振り付け型 | 作業が失敗したら、それまでの作業を逆の順番で取り消す。それぞれの作業が次の作業や、前の作業を元に戻す作業を指示する。 |
| 調整型 | 全体の作業を監督する人がいて、その人がそれぞれの作業に指示を出す。監督役が作業の実行や失敗した場合の取り消し作業を指示する。 |
| メリット | 複雑な作業を小さな作業に分割し、順番に実行することで、全体の整合性を保つ。 |
| 活用場面 | インターネットを介して複数の場所で作業を行うシステムにおいて、情報の整合性を維持する。 |
| 例 | インターネット上の買い物 (注文受付、在庫確認、支払い、配送) |
Sagaパターンの種類

分散処理において、一連の作業を確実に実行するための手法である「物語」方式には、大きく分けて二つの種類があります。一つは振り付け方式、もう一つは指揮者方式です。
振り付け方式は、参加する各処理が、まるで舞台の役者のように、互いにメッセージをやり取りしながら連携して全体の流れを作り上げていく方式です。特定の指示を出す存在はおらず、各処理は受け取ったメッセージに応じて自身の役割を果たします。これは、各処理が独立して動作するため、変更や追加が容易であり、システム全体の柔軟性を高めることに繋がります。しかし、処理の数が増えると、全体の処理の流れを把握することが難しくなり、問題発生時の原因究明に時間がかかる可能性があります。また、各処理が互いの存在を意識する必要があるため、処理間の依存関係が複雑になる場合もあります。
一方、指揮者方式は、オーケストラの指揮者のように、中央の制御役が全体の流れを管理し、各処理に指示を出す方式です。この中央の制御役は、各処理の実行状況を監視し、必要に応じて再実行や取消などの指示を出します。これにより、全体の流れが明確になり、管理や監視が容易になります。また、問題発生時には、中央の制御役が原因を特定し、適切な対応を取ることができるため、迅速な復旧が可能になります。しかし、中央の制御役に処理が集中するため、負荷が高くなり、システム全体の性能に影響を与える可能性があります。また、中央の制御役が単一障害点となるため、その信頼性を確保することが重要になります。
どちらの方式にも利点と欠点があるため、システムの特性や規模、複雑さなどを考慮して、適切な方式を選択する必要があります。柔軟性と独立性を重視する場合は振り付け方式、明確な管理と監視を重視する場合は指揮者方式が適していると言えるでしょう。
| 項目 | 振り付け方式 | 指揮者方式 |
|---|---|---|
| 処理の流れ | 各処理がメッセージをやり取りして連携 | 中央の制御役が各処理に指示 |
| メリット | 変更や追加が容易、システム全体の柔軟性が高い | 全体の流れが明確、管理や監視が容易、迅速な復旧が可能 |
| デメリット | 処理の流れの把握が困難、問題発生時の原因究明に時間がかかる、処理間の依存関係が複雑になる場合も | 中央の制御役に負荷が集中、単一障害点となる |
| 特徴 | 各処理が独立して動作、互いの存在を意識する必要あり | 中央の制御役が全体を管理、各処理の実行状況を監視 |
Sagaパターンの利点

分散システムにおいて、複数のサービスが連携して動作する際に、データの整合性を保つことは非常に重要です。特に、マイクロサービスのように、各サービスが独立してデータ管理を行う構成では、全体としてのデータの一貫性を維持することは容易ではありません。このような課題に対して、Sagaパターンは有効な解決策となります。Sagaパターンは、複雑なトランザクションを複数の小さなトランザクションに分割し、各サービスが順次実行することで、全体的な整合性を確保する仕組みです。
従来の一枚岩のシステムでは、一つのデータベースで全てのデータを管理するため、トランザクション処理は比較的単純でした。しかし、一枚岩のシステムは、一部の変更がシステム全体に影響を与える可能性があり、保守や拡張が困難になる場合があります。また、一つのサービスの障害がシステム全体に波及するリスクも抱えています。これに対して、マイクロサービスは個々のサービスが独立して動作するため、変更や保守が容易で、障害の影響も局所的に抑えられます。しかし、複数のサービスが連携して動作する際に、データの整合性をどのように維持するかが課題となります。
Sagaパターンでは、各サービスが独立したトランザクションを実行し、成功または失敗を次のサービスに伝えることで、全体的な整合性を維持します。もし、あるサービスで処理が失敗した場合、それまでの処理を元に戻すための補償トランザクションが実行されます。これにより、たとえ一部のサービスで障害が発生しても、データの整合性を保つことが可能となります。Sagaパターンは、各サービスの独立性を維持しつつ、全体的なデータの一貫性を確保できるため、マイクロサービスアーキテクチャに最適な手法と言えるでしょう。個々のサービスの開発と保守を容易にし、システム全体の可用性を向上させることができるため、現代の複雑なシステム開発において、ますます重要な役割を担うと考えられます。
| システム | メリット | デメリット | データ整合性 | トランザクション |
|---|---|---|---|---|
| 一枚岩 | トランザクション処理が単純 |
|
1つのDBで管理 | 比較的単純 |
| マイクロサービス |
|
データ整合性維持が課題 | Sagaパターン |
|
Sagaパターンの課題

物語型とでも呼ぶべき一連の処理を管理する手法、物語型処理手法には、利点がある一方で、いくつかの課題も存在します。まず、元に戻す処理を作るのが複雑になる場合があります。それぞれの小さな処理に対応する、適切な元に戻す処理を設計し、作らなければなりません。例えば、商品の注文、在庫の確保、配送の手配という一連の処理があった場合、注文をキャンセルするときには、在庫の確保を解除し、配送の手配を取り消す処理を作る必要があります。
また、処理同士のやり取りが複雑になるため、誤りを見つける作業や試験が難しくなる可能性もあります。特に、各処理が独立して連携する方式では、処理同士の連携が複雑になりやすく、問題が起きた時の原因究明が困難になる場合があります。例えば、配送の手配で問題が起きた場合、その原因が配送処理自体にあるのか、在庫確保処理との連携にあるのかを特定するのが難しくなります。
さらに、同時に複数の処理が走る場合の問題も考える必要があります。複数の物語型処理の例が同時に動く場合、情報の衝突が起きる可能性があるため、適切な情報のやり取り調整の仕組みを導入する必要があります。例えば、同じ商品の在庫を複数の注文で同時に確保しようとした場合、在庫数が足りなくなる可能性があります。これを防ぐためには、在庫の確保処理を順番に行うように調整する必要があります。
これらの課題に適切な対応をすることで、物語型処理手法の利点を最大限に活かすことができます。複雑な処理を小さな処理に分割して管理することで、システム全体の柔軟性や回復力を高めることができます。しかし、その反面、元に戻す処理の作成や処理間の連携の複雑さといった課題も存在します。これらの課題を理解し、適切な対策を講じることで、物語型処理手法を効果的に活用することが可能になります。
| 課題 | 詳細 | 例 |
|---|---|---|
| 元に戻す処理の作成が複雑 | 小さな処理それぞれに対応する適切な元に戻す処理を設計、作成する必要がある | 注文キャンセル時に、在庫確保の解除、配送手配の取消処理が必要 |
| 処理同士のやり取りが複雑になり、誤りを見つける作業や試験が困難 | 特に、各処理が独立して連携する方式では、処理同士の連携が複雑になりやすく、問題発生時の原因究明が困難 | 配送手配で問題発生時、原因が配送処理自体か在庫確保処理との連携か特定が難しい |
| 同時に複数の処理が走る場合の問題 | 複数の処理が同時に動く場合、情報の衝突の可能性があるため、適切な情報のやり取り調整の仕組みが必要 | 同じ商品の在庫を複数の注文で同時に確保しようとした場合、在庫不足の可能性 |
まとめ

分散システム、例えば小さな部品のようなサービスをたくさん組み合わせたシステムを想像してみてください。このようなシステムでは、複数のサービスをまたいでデータの整合性を保つことが難しくなります。例えば、商品の注文、在庫の確認、支払いの処理など、それぞれ別のサービスで行っているとします。一つでも失敗すると、全体の整合性が崩れてしまいます。このような問題を解決する一つの方法が、「サーガ」と呼ばれる手法です。
サーガは、複雑な処理を小さな作業に分割し、それぞれの作業が成功したかを確認しながら進めていきます。例えば、注文、在庫確認、支払いをそれぞれ小さな作業として、順番に実行します。もし在庫確認で失敗したら、注文を取り消す処理を実行します。このように、失敗した作業を元に戻す仕組みを「補償処理」と呼びます。それぞれの作業と、それに対応する補償処理を組み合わせることで、全体の整合性を保つことができるのです。
サーガを使うことで、システム全体を止めずに、一部のサービスが停止していても処理を続けることができます。また、それぞれのサービスを独立して変更・更新できるため、システム全体の保守性も向上します。
しかし、サーガにも難しい点があります。一つは、補償処理をきちんと設計・実装する必要がある点です。複雑な処理の場合、補償処理も複雑になりがちで、慎重に考える必要があります。もう一つは、サービス間の通信です。複数のサービスが連携して動作するため、通信の複雑さや遅延などが問題となる可能性があります。
サーガは強力な手法ですが、万能ではありません。システムの特性や要求に応じて、適切に設計・実装することが重要です。サーガの仕組みを正しく理解し、適切に活用することで、より頑丈で柔軟な分散システムを作ることができるでしょう。
| 項目 | 説明 |
|---|---|
| 分散システムの課題 | 複数のサービスをまたいでデータの整合性を保つことが難しい。例:商品の注文、在庫の確認、支払いの処理 |
| サーガ | 複雑な処理を小さな作業に分割し、それぞれの作業が成功したかを確認しながら進める手法。 |
| 補償処理 | 失敗した作業を元に戻す仕組み。例:在庫確認で失敗したら、注文を取り消す処理を実行。 |
| サーガのメリット |
|
| サーガの課題 |
|
| 結論 | サーガは強力な手法だが、万能ではない。システムの特性や要求に応じて、適切に設計・実装することが重要。 |
