健康检查

解释了 gRPC 服务器如何暴露健康检查服务,以及如何配置客户端以自动检查其连接到的服务器的健康状况。

健康检查

解释了 gRPC 服务器如何暴露健康检查服务,以及如何配置客户端以自动检查其连接到的服务器的健康状况。

概述

gRPC 定义了一个标准的服务 API(health/v1),用于对 gRPC 服务器执行健康检查调用。此服务已提供实现,但您需要负责更新您的服务的健康状态。

在客户端,您可以让客户端自动与您的后端健康服务通信。这使得客户端可以避免不健康的服务。

服务端健康检查服务

gRPC 服务器上的健康检查服务支持两种操作模式

  • 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++ 示例