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 要小。