同期的なリモープロシージャパターン
クライアントとサーバー間がプロキシインターフェースを介して同期的に(クライアントがレスポンスを期待して)やり取りを行う。プロキシインターフェースが通信のプロトコルをカプセル化する。
通信のプロトコルとして、RESTとgRPCについて取り上げる。
REST
RESTは、ビジネスオブジェクトやそのコレクションを表すリソースを、HTTPメソッドで操作するようにエンドポイントをもつAPI。APIは、インターフェース定義言語で定義しなければならない。
メリット
- curlやPostmanで簡単にAPIを叩くことができる
- リクエスト/レスポンススタイルをサポートしている
- 中間のブローカーが不要でアーキテクチャが単純になる デメリット
- リクエスト/レスポンススタイル以外の通信を利用できない
- クライアントーサーバー間が直接通信しているので、可用性が下がる
- クライアントがサービスインスタンスの位置を知っている必要がある
- (解決策⇛[サービスディスカバリ])
- 1つのリクエストで複数のリソースをフェッチできない
gRPC
HTTP/2を利用してプロトコルバッファ形式のメッセージをやりとりするAPI。
メリット
- 操作に対して命名できるのでAPIの設計がしやすい
- 大きなメッセージのやりとりでも効率的でコンパクトに通信できる
- 双方向ストリーミングのため、RPI、メッセージの両方のスタイルで通信できる
- 言語に依存しない
デメリット
- JavaScriptクライアントでは扱いづらい
- 古いファイアウォールでは対応していない場合がある
RPIのエラー処理
同期的にサービスを呼び出す場合、以下について検討し、障害から守る必要がある。
fault-tolerance-in-a-high-volume-distributed-system - netflix
- レスポンスを待つときはネットワークタイムアウトを指定する。リソースが必ず開放されるようにする。
- クライアントから未応答のリクエストの許容上限を決めておく
- [Circuit breaker パターン]
サービス障害時のエラーの修復としては
- クライアントにエラーを返す
- デフォルト値やキャッシュした値を返却する
- サービスそのものが障害で動作しない可能性もあるため、適切にサービスを