Keepalive
如何在 gRPC 中使用基于 HTTP/2 PING 的 keepalive。
Keepalive
如何在 gRPC 中使用基于 HTTP/2 PING 的 keepalive。
概述
基于 HTTP/2 PING 的 keepalive 是一种保持 HTTP/2 连接活动的方式,即使没有数据传输。这是通过定期发送一个 PING 帧 到连接的另一端来完成的。HTTP/2 keepalive 可以提高 HTTP/2 连接的性能和可靠性,但仔细配置 keepalive 间隔非常重要。
注意
有一个相关但不同的问题称为 [健康检查]。健康检查允许服务器指示服务是否健康,而 keepalive 仅与连接有关。背景
TCP keepalive 是一种众所周知的维护连接和检测断开连接的方法。当启用 TCP keepalive 时,连接的任何一方都可以发送冗余数据包。一旦被另一方确认,该连接将被视为良好。如果在多次尝试后未收到 ACK,则认为该连接已断开。
与 TCP keepalive 不同,gRPC 使用 HTTP/2,它提供了一个强制性的 PING 帧,可用于估计往返时间、带宽延迟乘积或测试连接。TCP keepalive 中的间隔和重试并不完全适用于 PING,因为传输是可靠的,因此在 gRPC 基于 PING 的 keepalive 实现中,它们被超时(相当于间隔 * 重试)所取代。
注意
服务所有者不需要支持 keepalive。客户端作者必须与服务所有者协调,以确定特定的客户端设置是否可以接受。服务所有者决定他们愿意支持什么,包括他们是否愿意接收 keepalive(如果服务不支持 keepalive,则前几个 keepalive ping 将被忽略,服务器最终将发送一个GOAWAY
消息,其调试数据等于 too_many_pings
的 ASCII 代码)。配置 keepalive 如何影响调用
对于快速回复的一元 RPC,不太可能触发 Keepalive。Keepalive 主要在存在长时间运行的 RPC 时触发,如果 keepalive 检查失败并且连接关闭,则该 RPC 将失败。
对于流式 RPC,如果连接关闭,任何正在进行的 RPC 将失败。如果调用正在流式传输数据,则流也将关闭,并且任何尚未发送的数据都将丢失。
警告
为了避免 DDoS 攻击,在设置 keepalive 配置时务必谨慎。因此,建议避免在没有调用时启用 keepalive,并且客户端避免将其 keepalive 配置为低于一分钟。keepalive 可能有用的常见情况
gRPC HTTP/2 keepalive 在各种情况下都很有用,包括但不限于
- 通过可能被代理或负载均衡器视为空闲的长期连接发送数据时。
- 当网络不太可靠时(例如,移动应用程序)。
- 在长时间不活动后使用连接时。
Keepalive 配置规范
选项 | 可用性 | 描述 | 客户端默认值 | 服务器默认值 |
---|---|---|---|---|
KEEPALIVE_TIME | 客户端和服务器 | PING 帧之间的间隔,以毫秒为单位。 | INT_MAX (禁用) | 7200000 (2 小时) |
KEEPALIVE_TIMEOUT | 客户端和服务器 | PING 帧被确认的超时时间,以毫秒为单位。如果发送方在此时间内未收到确认,它将关闭连接。 | 20000 (20 秒) | 20000 (20 秒) |
KEEPALIVE_WITHOUT_CALLS | 客户端 | 是否允许在没有任何未完成的流的情况下从客户端发送 keepalive ping。 | 0 (false) | 不适用 |
PERMIT_KEEPALIVE_WITHOUT_CALLS | 服务器 | 是否允许在没有任何未完成的流的情况下从客户端发送 keepalive ping。 | 不适用 | 0 (false) |
PERMIT_KEEPALIVE_TIME | 服务器 | 服务器在不发送任何数据/标头帧的情况下接收到连续 ping 帧之间的最小允许时间。 | 不适用 | 300000 (5 分钟) |
MAX_CONNECTION_IDLE | 服务器 | 通道可能没有未完成的 RPC 的最大时间,之后服务器将关闭连接。 | 不适用 | INT_MAX (无限) |
MAX_CONNECTION_AGE | 服务器 | 通道可能存在的最大时间。 | 不适用 | INT_MAX (无限) |
MAX_CONNECTION_AGE_GRACE | 服务器 | 通道达到最大年龄后的宽限期。 | 不适用 | INT_MAX (无限) |
注意
某些语言可能提供其他选项,请参阅语言示例和其他资源了解更多详细信息。语言指南和示例
语言 | 示例 | 文档 |
---|---|---|
C++ | C++ 示例 | C++ 文档 |
Go | Go 示例 | Go 文档 |
Java | Java 示例 | Java 文档 |
Python | Python 示例 | Python 文档 |
其他资源
上次修改时间 2024 年 10 月 9 日:添加 gRPC Keepalive Youtube 视频链接 (#1370) (79b65fd)