本記事では、複数サービスにまたがるデータベースの原子性、一貫性、分離性、持続性 (ACID)を担保しながら、処理時間の削減を実現するSAGAパターンと呼ばれるアーキテクチャパターンを紹介します
SAGAパターン概要
データベースが複数存在するシステムにおいて、データベース間の整合性を保つために調整が必要になります。
例として、データベースAとデータベースBに対して、商品Cの購入に関するデータを保存するケースを考えます。
データベースAに対する保存が成功した後に、データベースBに対する保存が失敗したとします。
この時、データベースAの保存を取り消すか、データベースBに対する保存をリトライする必要が生じます。
このように、データベースが複数存在するからこその調整が存在します。
この時、後ほど説明する2フェーズコミットのようにデータベース間の調整によって処理に時間がかかってしまう場合があります。
SAGAパターンはこの問題を解決するために提案されたイベント駆動のアーキテクチャです。
SAGAパターンを説明する前に、SAGAパターンが必要となった背景を説明します。
処理時間の長いトランザクション(Long lived transactions :LLTs)
外部サービス連携やマイクロサービスが普及するにつれ開発するシステムが複数のデータベースを持つことが珍しくなくなりました。
サービス単位にシステムを分割し、個々のサービスがデータベースを持つことで、サービスの開発者は一つのサービスとデータベースに集中して開発できます。
設計において、開発モジュールの関心事を減らしていくことは変更容易性をもたらす重要な指針であると言えます。
しかし、データベースを分割することにより、システム全体としてのデータの整合性を保つことが難しくなりました。
複数データベースを持つシステムの整合性を保つ方法として考えられたのが、2フェーズコミットです。
2フェーズコミット(2相コミット)
2フェーズコミットとは、複数のデータベースへの永続的な変更(コミット)する際に、変更を合意(コミット要求フェーズ)してから、変更(コミットフェーズ)することを言います。
この2フェーズコミットは全てのデータベースへのコミットが完了するか、どこかで失敗があれば、既にコミットしたデータベースでロールバックし、すべてのデータベースをコミットする前の状態に戻します。
この2フェーズコミットはデータベースの状態が分かりやすい反面、処理時間の肥大化という欠点があります。
先ほどのシステムを例にとると、
データベースBを管理する参加者の応答がデータベースAより著しく低い場合を仮定します。
2フェーズコミットでは、ロールバックする必要があるため、データベースAはデータベースBの処理完了を待っている間、データベースAは他の変更を受け付けないようにロックしている必要があります。
この時データベースAへのコミットを要求する他の調整者が存在する場合、この調整者はロックされたデータベースAの解放を待つ必要が出てきます。
このため、処理時間が肥大化する傾向にあるのです。
SAGAパターンが解決する課題
SAGAパターンは上記課題解決のため、複数データベースに対するトランザクションをイベント駆動で実現します。
SAGAパターンの特徴はロールバックしない点です。
ロールバックの代わりに"補正可能なトランザクション"を用いて、逆の効果を持つ別のトランザクションを実行しデータベースの整合性を保ちます。(結果整合性)
このような構成にすることで、データベースのロックを最小化します。
そしてこのSAGAパターンはコレオグラフィ、オーケストレーションと呼ばれる二つの実現方式が存在します
SAGAパターン: コレオグラフィ
地方分権的にSAGAパターンを実現する方式です。
各サービスが、イベントの発行と待ち受けを行いシステム全体のトランザクションを実現します。この方式は、一元的な制御モジュールが存在しない点が特徴です。
コレオグラフィでは下記のメリットとデメリットが存在します
コレオグラフィのメリット
- 一元的な制御モジュールが不要
- 責任が各サービスに分散されるため単一障害点がない
コレオグラフィのデメリット
- 各サービスがどのイベントを待ち受けているかの追跡が難しく、新しいサービスを追加する際に実装が煩雑になりがち
- 各サービスが他のサービスのイベントを意識する必要があるためオーケストレーションと比較し密結合になる
SAGAパターン: オーケストレーション
中央集権的にSAGAパターンを実現する方式です。
オーケストレーションは、コーディネータと呼ばれる一元的な制御モジュールがイベントの発行と待ち受けを管理します。イベントの発行順序やイベントの結果に応じた振る舞いなどはこのコーディネータに集中化されます。
オーケストレーションでは下記のメリットとデメリットが存在します
オーケストレーションのメリット
- 各サービスが待ち受けているイベントの追跡が容易で、新しいサービスを追加しやすい
- 各サービスはコーディネータからのイベントのみを意識するため、各サービスはコレオグラフィと比較して疎結合になる
オーケストレーションのデメリット
- コーディネータの追加実装が必要
- コーディネータの障害という単一障害点の発生
まとめ
本記事はSAGAパターンの解決する課題、SAGAパターンを実現する2つの方式(コレオグラフィ、オーケストレーション)について紹介させて頂きました。
コレオグラフィと、オーケストレーションのどちらを採用するかについては、
あくまでアーキテクトとしての私見ですがオーケストレーションをおすすめします。
各サービスの疎結合を保ち、将来の変更容易性に優れている点でオーケストレーションを採用したいと考えます。
しかし、将来サービスの追加がないことが確定している場合や、プロトレベルで早く実現することが求められている場合は、コレオグラフィが優位かと考えられます。
0 件のコメント :
コメントを投稿