ヘルスチェック
gRPCサーバーがヘルスチェックサービスをどのように公開し、クライアントが接続先のサーバーのヘルスを自動的にチェックするようにどのように設定できるかを説明します。
ヘルスチェック
概要
gRPCは、gRPCサーバーに対してヘルスチェックを実行するための標準サービスAPI(health/v1)を定義しています。このサービスのAPIは提供されますが、サービスのヘルスステータスを更新するのはお客様の責任です。
クライアント側では、クライアントがバックエンドのヘルスサービスと自動的に通信するように設定できます。これにより、クライアントはヘルスチェックで異常と判断されたサービスを回避できます。
サーバー側のヘルスサービス
gRPCサーバーのヘルスチェックサービスは、2つの動作モードをサポートしています。
CheckRPCエンドポイントへの単項呼び出し- 一元化された監視またはロードバランシングソリューションに役立ちますが、多数のgRPCクライアントが継続的にヘルスチェックを行うような大規模な環境には対応できません。
WatchRPCエンドポイントを使用したストリーミングヘルスアップデート- gRPCクライアントのクライアント側ヘルスチェック機能で使用されます。
サーバーでヘルスチェックサービスを有効にするには、以下の手順を実行します。
- 提供されているヘルスチェックライブラリを使用して、ヘルスチェックサービスを作成します。
- ヘルスチェックサービスをサーバーに追加します。
- サービスのヘルス状態が変更されたときに、ヘルスチェックライブラリに通知します。
NOT_SERVING:サービスが現在リクエストを受け付けられない場合SERVING:サービスが利用可能な場合- 個々のサービスのヘルス状態を気にする必要がない場合は、空文字列("")を使用してサーバー全体のヘルスを表すことができます。
- サーバーシャットダウンの際には、ヘルスチェックライブラリに通知して、接続されているすべてのクライアントに通知できるようにしてください。
詳細については、以下の言語サポートセクションを参照してください。
クライアントのヘルスチェックを有効にする
gRPCクライアントは、チャンネルのサービス設定を変更することで、接続するサーバーに対してヘルスチェックを実行するように構成できます。例として、fooサービスのヘルス状態を監視するには、(JSON形式で)以下のようにします。
{
"healthCheckConfig": {
"serviceName": "foo"
}
}
サーバーが空文字列("")サービスに対してヘルス状態を報告する場合、これはサーバー全体のヘルス状態を示すため、ここでも空文字列を使用できます。
ヘルスチェックを有効にすると、サーバーへの呼び出しに関する一部の動作が変更されます。
- クライアントは、接続が確立されたときに、ヘルスチェックサービスに対して
WatchRPCも呼び出します。- 呼び出しが失敗した場合、その呼び出しが
UNIMPLEMENTEDステータスで失敗しない限り、リトライが行われます(指数バックオフを使用)。この場合、ヘルスチェックは無効になります。
- 呼び出しが失敗した場合、その呼び出しが
- 呼び出し対象のサービスに対してヘルスチェックサービスが正常なステータスを送信するまで、リクエストは送信されません。
- 正常なサービスが異常になった場合、クライアントはそのサービスへのリクエスト送信を停止します。
- サービスが後で正常になった場合、呼び出しは再開されます。
- 一部のロードバランシングポリシーでは、ポリシーと機能が合わない場合にヘルスチェックを無効にすることができます(例:
pick_firstはこのように動作します)。
具体的には、サブチャンネル(サーバーへの物理的な接続を表す)の状態は、接続先のサービスのヘルス状態に基づいて、これらの状態を通過します。
stateDiagram-v2
[*] --> IDLE
IDLE --> CONNECTING : Connection requested
CONNECTING --> READY : Health check#colon;\nSERVING
CONNECTING --> TRANSIENT_FAILURE : Health check#colon;\nNOT_SERVING\nor call fails
READY --> TRANSIENT_FAILURE : Health check#colon;\nNOT_SERVING
READY --> IDLE : Connection breaks\nor times out
TRANSIENT_FAILURE --> READY : Health check#colon;\nSERVING
note right of TRANSIENT_FAILURE : Allows the load balancer to choose\nanother, working subchannel
ここでも、クライアント側ヘルスチェックを有効にする方法は言語によって異なります。言語サポートセクションの例を参照してください。
言語サポート
| 言語 | 例 |
|---|---|
| Java | Javaの例 |
| Go | Goの例 |
| Python | Pythonの例 |
| C++ | C++の例 |