保活

如何在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的保持连接实现中,它们被替换为超时(相当于间隔*重试)。

配置保持连接如何影响调用

对于快速响应的单次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 文档

其他资源