Keepalive User Guide for gRpc Core(and dependents)

keepalive ping 是一种检查 channel 当前是否在工作的方式,通过在通信端口上发送HTTP2 pings 的方式。他会定期的发送,且如果在特定的时间内,对端没有确认ping,通信端口断开连接。

grpc ping frame 是双向发送的。

keepalive ping 由两个重要的 channel 参数控制-

  • GRPC_ARG_KEEPALIVE_TIME_MS
  • 这个 channel 参数在keepalive ping 在通信端口上发送之后的时段(以毫秒为单位)。
  • GRPC_ARG_KEEPALIVE_TIMEOUT_MS
  • 这个 channel 参数控制时间的数量(以毫秒为单位),keepalive ping 的发送方等待确认的时间。如果在这个时间内,发送方没有收到一个确认,将关闭连接。

上述两个参数对于大部分的用户来说已经足够了,但是下述的参数在特定的使用场景中也有用:

  • GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS
  • 这个 channel 参数被设置为1(0:false, 1:true),允许 keepalive ping被发送,即使in flight中没有调用。
  • GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA
  • 这个channel参数控制能被发送的pings的最大数量,当没有 data/header frame 被发送时。GRPC Core 将不会继续发送ping,如果超出发送数量限制。设置为0则不设限制。
  • GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS
  • 如果没有 data/frames 在通信端口上被发送,服务器边的这个 channel 参数控制 gRPC Core 期望两次成功的pings接受的最小间隔时间(以毫秒为单位)。如果两次成功的 pings 间的间隔时间小于设定的时间,ping 将被认为是一个来自对端的 bad ping。这样的ping被认为是 “ping strike”。在客户端方面,这无任何影响。
  • GRPC_ARG_HTTP_MAX_PING_STRIKES
  • 这个参数控制最大的 bad ping 的数量,在发送HTTP2 GOAWAY frame 和关闭通信端口前,服务器会忍受这些 bad pings。将它设置为0允许服务器接收任意数量的bad pings。

Default Values

channel 参数

客户端

服务器

GRPC_ARG_KEEPALIVE_TIME_MS

INT_MAX (disabled)

7200000 (2 hours)

GRPC_ARG_KEEPALIVE_TIMEOUT_MS

20000 (20 seconds)

20000 (20 seconds)

GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS

0(false)

0(false)

GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA

2

2

GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS

N/A

300000 (5 minutes)

GRPC_ARG_HTTP2_MAX_PING_STRIKES

N/A

2

FAQ

  • 何时 keepalive 定时器启动?
  • 当通信端口连接完成后(在握手之后)。
  • keepalive 定时器 fires 后会发生什么?
  • 当keepalive定时器fires,gRPC Core 将尝试在通信端口上发送 keepalive ping。ping可能会阻塞,如果:
  • 在通信端口上没有活动的调用,且GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS是false。
  • 已经发送到通信端口的不携带任何 data 的 pings 的数量已经超过了 GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA。
  • 如果keepalive ping 在通信端口上发送,且不阻塞,然后 keepalive watchdog timer 被启动,如果ping在他fire之前没有被识别,他将关闭端口。
  • 为何我接受到一个GOAWAY,错误码为ENHANCE_YOUR_CALM?
  • 如果客户端发送太多的 misbehaving 的pings,服务器会发送一个携带ENHANCE_YOUR_CALM的GOAWAY。一些可能发生这种情况的情境:
  • 如果一个服务器的GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS被设置为fasle,同时客户端将其设置为true,这造成纵使没有call in flight,resulting ping还是会被一直发送。
  • 客户端的GRPC_ARG_KEEPALIVE_TIME_MS设置的比服务器的GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS 要小。