ヘルスチェック

gRPCサーバーがヘルスチェックサービスをどのように公開し、クライアントが接続先のサーバーのヘルスを自動的にチェックするようにどのように設定できるかを説明します。

ヘルスチェック

gRPCサーバーがヘルスチェックサービスをどのように公開し、クライアントが接続先のサーバーのヘルスを自動的にチェックするようにどのように設定できるかを説明します。

概要

gRPCは、gRPCサーバーに対してヘルスチェックを実行するための標準サービスAPI(health/v1)を定義しています。このサービスのAPIは提供されますが、サービスのヘルスステータスを更新するのはお客様の責任です。

クライアント側では、クライアントがバックエンドのヘルスサービスと自動的に通信するように設定できます。これにより、クライアントはヘルスチェックで異常と判断されたサービスを回避できます。

サーバー側のヘルスサービス

gRPCサーバーのヘルスチェックサービスは、2つの動作モードをサポートしています。

  • Check RPCエンドポイントへの単項呼び出し
    • 一元化された監視またはロードバランシングソリューションに役立ちますが、多数のgRPCクライアントが継続的にヘルスチェックを行うような大規模な環境には対応できません。
  • Watch RPCエンドポイントを使用したストリーミングヘルスアップデート
    • gRPCクライアントのクライアント側ヘルスチェック機能で使用されます。

サーバーでヘルスチェックサービスを有効にするには、以下の手順を実行します。

  1. 提供されているヘルスチェックライブラリを使用して、ヘルスチェックサービスを作成します。
  2. ヘルスチェックサービスをサーバーに追加します。
  3. サービスのヘルス状態が変更されたときに、ヘルスチェックライブラリに通知します。
    • NOT_SERVING:サービスが現在リクエストを受け付けられない場合
    • SERVING:サービスが利用可能な場合
    • 個々のサービスのヘルス状態を気にする必要がない場合は、空文字列("")を使用してサーバー全体のヘルスを表すことができます。
  4. サーバーシャットダウンの際には、ヘルスチェックライブラリに通知して、接続されているすべてのクライアントに通知できるようにしてください。

詳細については、以下の言語サポートセクションを参照してください。

クライアントのヘルスチェックを有効にする

gRPCクライアントは、チャンネルのサービス設定を変更することで、接続するサーバーに対してヘルスチェックを実行するように構成できます。例として、fooサービスのヘルス状態を監視するには、(JSON形式で)以下のようにします。

{
  "healthCheckConfig": {
    "serviceName": "foo"
  }
}

サーバーが空文字列("")サービスに対してヘルス状態を報告する場合、これはサーバー全体のヘルス状態を示すため、ここでも空文字列を使用できます。

ヘルスチェックを有効にすると、サーバーへの呼び出しに関する一部の動作が変更されます。

  • クライアントは、接続が確立されたときに、ヘルスチェックサービスに対してWatch RPCも呼び出します。
    • 呼び出しが失敗した場合、その呼び出しが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 

ここでも、クライアント側ヘルスチェックを有効にする方法は言語によって異なります。言語サポートセクションの例を参照してください。

言語サポート

言語
JavaJavaの例
GoGoの例
PythonPythonの例
C++C++の例