保活
如何在gRPC中使用基于HTTP/2 PING的保持连接。
保活
如何在gRPC中使用基于HTTP/2 PING的保持连接。
概述
基于HTTP/2 PING的保持连接是一种即使在没有数据传输时也能保持HTTP/2连接活跃的方式。这是通过定期向连接的另一端发送 PING帧 来实现的。HTTP/2保持连接可以提高HTTP/2连接的性能和可靠性,但仔细配置保持连接间隔非常重要。
注意
存在一个相关但独立的关注点,称为[健康检查]。健康检查允许服务器发出信号,指示某个服务是否健康,而保持连接仅关注连接本身。背景
TCP保持连接 是一种众所周知的维护连接和检测断开连接的方法。当启用TCP保持连接时,连接的任何一方都可以发送冗余数据包。一旦被对方确认,连接将被认为是良好的。如果重复尝试后未收到确认,则连接被视为已断开。
与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保持连接YouTube视频链接 (#1370) (79b65fd)