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

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