心跳连接
如何在 gRPC 中使用基于 HTTP/2 PING 的心跳连接。
心跳连接
如何在 gRPC 中使用基于 HTTP/2 PING 的心跳连接。
概述
基于 HTTP/2 PING 的心跳连接是一种即使在没有数据传输时也能保持 HTTP/2 连接活跃的方式。这是通过定期向连接的另一端发送 PING 帧来实现的。HTTP/2 心跳连接可以提高 HTTP/2 连接的性能和可靠性,但仔细配置心跳连接间隔非常重要。
注意
有一个相关但不同的概念称为 [健康检查]。健康检查允许服务器指示一个*服务*是否健康,而心跳连接仅与*连接*有关。背景
TCP 心跳连接是一种维护连接和检测断开连接的常用方法。当启用 TCP 心跳连接时,连接的任何一方都可以发送冗余数据包。一旦被另一端确认 (ACK),该连接将被视为良好。如果在重复尝试后仍未收到确认,则认为连接已断开。
与 TCP 心跳连接不同,gRPC 使用 HTTP/2,后者提供了一个强制性的 PING 帧,可用于估算往返时间、带宽-延迟积或测试连接。TCP 心跳连接中的间隔和重试不完全适用于 PING,因为传输是可靠的,所以在 gRPC 基于 PING 的心跳连接实现中,它们被超时(等同于间隔 * 重试)取代。
注意
服务所有者并非必须支持心跳连接。客户端开发者必须与服务所有者协调,以确定特定的客户端设置是否可接受。服务所有者决定他们愿意支持什么,包括是否愿意接收心跳连接请求(如果服务不支持心跳连接,前几个心跳连接 ping 将被忽略,服务器最终会发送一个带有调试数据等于too_many_pings
ASCII 码的 GOAWAY
消息)。配置心跳连接如何影响调用
对于快速回复的一元 RPC,心跳连接不太可能被触发。心跳连接主要在存在长时间运行的 RPC 时触发,如果心跳连接检查失败并且连接被关闭,该 RPC 将失败。
对于流式 RPC,如果连接关闭,任何正在进行的 RPC 都将失败。如果一个调用正在传输数据,该流也将被关闭,并且任何尚未发送的数据都将丢失。
警告
为避免分布式拒绝服务 (DDoS) 攻击,在设置心跳连接配置时务必谨慎。因此,建议避免在没有活动调用时启用心跳连接,并且客户端应避免将心跳连接间隔配置得远低于一分钟。心跳连接可能有用的一些常见场景
gRPC HTTP/2 心跳连接在多种情况下非常有用,包括但不限于:
- 通过长时间存在的连接发送数据时,该连接可能被代理或负载均衡器视为空闲。
- 网络可靠性较低时(例如,移动应用程序)。
- 在长时间不活动后使用连接时。
心跳连接配置规范
选项 | 可用性 | 描述 | 客户端默认值 | 服务器默认值 |
---|---|---|---|---|
KEEPALIVE_TIME | 客户端和服务器 | PING 帧之间的间隔,单位为毫秒。 | INT_MAX(已禁用) | 7200000(2 小时) |
KEEPALIVE_TIMEOUT | 客户端和服务器 | PING 帧等待确认的超时时间,单位为毫秒。如果发送方在此时间内未收到确认,将关闭连接。 | 20000(20 秒) | 20000(20 秒) |
KEEPALIVE_WITHOUT_CALLS | 客户端 | 在没有任何未完成的流时,是否允许客户端发送心跳连接 ping。 | 0(假) | 不适用 |
PERMIT_KEEPALIVE_WITHOUT_CALLS | 服务器 | 在没有任何未完成的流时,是否允许客户端发送心跳连接 ping。 | 不适用 | 0(假) |
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)