grpc keepalive使用指南

keepalive ping是一种通过transport发送HTTP2 ping来检查通道当前是否工作的方法。它是周期性发送的,如果在某个超时周期内该ping没有得到对等方的确认,则传输断开连接。
本指南记录了gRPC core中控制keepalive ping行为方式。
keepalive ping由两个重要的通道参数控制:

  • GRPC_ARG_KEEPALIVE_TIME_MS
    此channel参数控制在transport上发送keepalive ping的时间间隔(以毫秒为单位)。
  • GRPC_ARG_KEEPALIVE_TIMEOUT_MS
    此channel参数控制keepalive ping的发送方等待确认的时间(以毫秒为单位)。如果在此时间内未收到确认,它将关闭连接。

上面的两个通道参数对于大多数用户来说应该足够了,但是以下参数在某些用例中也很有用。

  • GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS
    如果将此通道参数设置为1(0:false; 1:true),则即使没有请求进行,也可以发送keepalive ping。
  • GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA
    当没有其他数据(数据帧或标头帧)要发送时,此通道参数控制可发送的最大ping数。如果超出限制,GRPC Core将不会继续发送ping。将其设置为0将允许在不发送数据的情况下发送ping命令。
  • GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS
    如果transport中没有接收到数据帧,则此channel参数控制gRPC Core在连续的ping之间等待的最短时间(以毫秒为单位)。
  • GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS
    如果transport中没有发送数据帧,则服务器端的此channel参数控制gRPC Core在接收连续ping之间期望的最短时间(以毫秒为单位)。如果连续两次ping之间的时间少于此时间,则该ping将被视为对等端的不良ping。这样的ping算作“ ping strike”。在客户端,这没有任何效果。
  • GRPC_ARG_HTTP2_MAX_PING_STRIKES
    此arg控制在发送HTTP2 GOAWAY帧并关闭传输之前,服务器允许的错误ping的最大数量。将其设置为0允许服务器接受任意数量的错误ping。(注:也就是达到这个数量的ping strike就会发送GOWAY帧–用于发起关闭连接的请求,或者警示严重错误。GOAWAY 会停止接收新流,并且关闭连接前会处理完先前建立的流)

默认值:
在这里插入图片描述

FAQ:

  • Keepalive计时器何时启动?
    transport完成连接后(握手后),将启动keepalive计时器。
  • 当keepalive计时器触发时会发生什么?
    • 当keepalive计时器触发时,gRPC Core将尝试在传输中发送keepalive ping。但是以下情况可以阻止此ping的发送
      • 该transport上没有活动调用,并且GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS为false。
      • transport中已发送的ping数目(在transport中没有其他data发送时)已超过GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA。
      • 自上次ping以来经过的时间少于GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS。
    • 如果keepalive的ping没有被blocked并在transport中发送,那么将启动keepalive watchdog计时器:如果在触发(timeout)前还未收到ping的确认,就会关闭transport
  • 为什么我收到错误代码为ENHANCE_YOUR_CALM的GOAWAY?
    • 如果客户端发送的ping存在太多不符合规则的,则服务器发送ENHANCE_YOUR_CALM的GOAWAY帧。例如
      • 如果服务器将GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS设置为false,但客户端却在没有任何请求的transport中发送ping。
      • 如果客户端设置的GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS的值低于服务器的GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS的值。

--------------以下是个人注释---------------
先说一下HTTP和TCP中的keepalive,这两个是完全不同的意图:

  • HTTP1.0中默认是关闭的,需要在HTTP头加入"Connection: Keep-Alive",才能启用Keep-Alive;HTTP1.1中默认启用Keep-Alive,加入"Connection: close ",才关闭。在HTTP1.0/1.1中开启keepalive是为了做连接复用。复用的目的是为了提高效率,在一个连接上传输多个请求。HTTP keepalive是通过共用TCP连接实现
  • TCP KeepAlive则是为了探测/保鲜(心跳检测,连接错误检测):用于探测对端的状态及网络情况(有可能客户端崩溃、强制关闭了应用、主机不可达等等),也有保鲜功能。比如如防止nat超时。TCP keepalive则是通过发送发送侦测包实现。在Linux中通过net.ipv4.tcp_keepalive_intvl,net.ipv4.tcp_keepalive_probes,net.ipv4.tcp_keepalive_time配置。

参考:
https://blog.csdn.net/weixin_37672169/article/details/80283935
http://www.nowamagic.net/academy/detail/23350305
https://pythonpig.github.io/2017/09/28/HTTP-keepalive&&TCP-KeepAlive-%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AF%B9%E6%AF%94/#0x02-http-keepalive%E4%B8%8Etcp-keepalive
https://segmentfault.com/a/1190000012894416
https://blog.chionlab.moe/2016/09/24/linux-tcp-keepalive/

grpc的keepalive是对应于TPC的keepalive

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章