通信パターン
分解されたサービス間でどのように通信するかを決定するためのパターン、つまり「通信」を解決するためのパターンです。
1. 同期パターン (Sync Pattern)
あるサービスが他のサービスに特定のリクエストを送信し、そのレスポンスを受け取るまで処理を停止しても問題ない場合に使用します。
主に以下の技術が使用されます:
- HTTP(Restful)
- gRPC
2. 非同期パターン (Async Pattern)
あるサービスが他のサービスに特定のリクエストを送信した後、そのレスポンスを即座に受け取る必要がない場合に使用します。
以下の技術が一般的に利用されます:
- Kafka などの メッセージキュー
- Callback
- Polling など
トランザクションパターン
MSA環境で「トランザクション」を解決するためのパターンです。
1. 2PC(2Phase Commit)
トランザクションの完了を2(N)段階で決定する方法です。
- 1フェーズ(Commit Request): トランザクションの準備段階としてコミットリクエストを送信します。
- 2フェーズ: 各サービスの結果を確認し、すべてが成功した場合にコミットを実行。失敗した場合は全体をロールバックします。
ただし、このプロセスを管理するコーディネーターが必要であり、リクエスト送信自体が失敗する可能性があるため、不安定で古典的な方法とされています。
例:
1つのトランザクションに2つのコミットリクエストが含まれる場合、最初のサービスは正常にコミットリクエストを送信したが、2番目のサービスでエラーが発生してロールバックリクエストを送信。しかし、最初のサービスへのロールバックリクエストが失敗する可能性があります。
2. 補償トランザクション (Compensating Transactions)
特定のリクエストが正常終了した後、そのアクション(トランザクション)を元の状態に戻すためのアクション(トランザクション)です。
- 2PCの欠点を補う形で登場した方法です。
- たとえば、2番目のサービスが失敗した場合、影響を受けたすべてのサービスに補償トランザクションを送信します。
- ただし、補償トランザクション自体が失敗する可能性もあります。
3. サガパターン (Saga Pattern)
トランザクションの前後関係を事前に定義し、必要に応じてコーディネーターが補償トランザクションを利用して管理することで、分散システム環境でトランザクションを実現するパターンです。
動作例:
- 最初のサービスが完了すると、サガを作成し、コーディネーターにイベントを発行します。
- 次のサービスでエラーが発生した場合、コーディネーターに問題を共有します。
- コーディネーターは、トランザクションが1つにまとめられていることを認識し、最初のサービスに補償トランザクションを送信します。
- サガが一定時間内に終了しない場合でも、補償トランザクションを送信できます。