心跳连接

如何在 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 的心跳连接实现中,它们被超时(等同于间隔 * 重试)取代。

配置心跳连接如何影响调用

对于快速回复的一元 RPC,心跳连接不太可能被触发。心跳连接主要在存在长时间运行的 RPC 时触发,如果心跳连接检查失败并且连接被关闭,该 RPC 将失败。

对于流式 RPC,如果连接关闭,任何正在进行的 RPC 都将失败。如果一个调用正在传输数据,该流也将被关闭,并且任何尚未发送的数据都将丢失。

心跳连接可能有用的一些常见场景

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++ 文档
GoGo 示例Go 文档
JavaJava 示例Java 文档
PythonPython 示例Python 文档

其他资源

最后修改时间:2024 年 10 月 9 日:添加 gRPC Keepalive Youtube 视频链接 (#1370) (79b65fd)