ヘルスチェック

gRPCサーバーがヘルスチェックサービスを公開する方法と、クライアントが接続先のサーバーのヘルス状態を自動的にチェックするように設定する方法について説明します。

ヘルスチェック

gRPCサーバーがヘルスチェックサービスを公開する方法と、クライアントが接続先のサーバーのヘルス状態を自動的にチェックするように設定する方法について説明します。

概要

gRPCは、gRPCサーバーに対してヘルスチェック呼び出しを実行するための標準サービスAPI(health/v1)を指定します。このサービスの実装は提供されていますが、サービスのヘルス状態を更新するのはあなたの責任です。

クライアント側では、クライアントがバックエンドのヘルスサービスと自動的に通信するようにできます。これにより、クライアントはヘルス状態が良くないと見なされるサービスを避けることができます。

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

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++まだ利用できません