gRPC keepalive 的作用:
gRPC 做服務(wù)間的通訊時(shí),由于配置問題容易出現(xiàn)各類非預(yù)期的異常情況旭等,能夠很好的避免transport is closing 的錯(cuò)誤酌呆,通過keepalive 機(jī)制能夠解決這種連接長時(shí)間沒被使用,被服務(wù)端斷開的情況搔耕;
但是如果配置不當(dāng)也會頻繁出現(xiàn)各種異常隙袁;
服務(wù)端:
gRPC的服務(wù)端keepalive參數(shù),:
/** MaxConnectionIdle 最大空閑鏈接時(shí)間弃榨,即空閑鏈接在配置的時(shí)間內(nèi)菩收,未收到新的心跳和請求,則會將鏈接關(guān)閉鲸睛,比向客戶端發(fā)送一個(gè)GoAway娜饵;
空閑鏈接的定義:最近未完成的RPC數(shù)變?yōu)? 的時(shí)間,或鏈接建立以來腊凶;
默認(rèn)是無窮
*/
MaxConnectionIdle
// 最長鏈接時(shí)間划咐,當(dāng)stream超過這個(gè)時(shí)間會發(fā)一個(gè)GoAway;為了防止短時(shí)間內(nèi)發(fā)送大量的GoAway 會根據(jù) MaxConnectionAge 時(shí)間間隔隨機(jī)+/- 10%
// 默認(rèn)是無窮
MaxConnectionAge
// 是對MaxConnectionAge 的一個(gè)補(bǔ)充钧萍,超過了最長鏈接時(shí)間后延長的時(shí)間
// 默認(rèn)是無窮
MaxConnectionAgeGrace
/**
服務(wù)端在設(shè)定的時(shí)間范圍內(nèi)未收到客戶端任何活動(dòng)褐缠,例如stream在時(shí)間內(nèi)未收到數(shù)據(jù)信息,則會發(fā)送ping 信息檢查鏈接是否可用风瘦;
及時(shí)發(fā)現(xiàn)及時(shí)重試队魏;
當(dāng)設(shè)置值小于1秒時(shí),會被強(qiáng)制設(shè)置成1秒
*/
Time 默認(rèn)是2小時(shí)
// 服務(wù)端發(fā)送ping請求后万搔,等待配置的時(shí)間胡桨,若客戶端在這個(gè)時(shí)間內(nèi)未有任何響應(yīng)則將該鏈接關(guān)閉回收
Timeout 默認(rèn)是20秒
EnforcementPolicy的配置,用于在服務(wù)器端設(shè)置 keepalive 強(qiáng)制策略瞬雹。服務(wù)器將關(guān)閉與違反此策略的客戶端的連接
// MinTime 是客戶端在發(fā)送 keepalive ping 之前應(yīng)等待的最短時(shí)間昧谊;
// 即兩個(gè)keepalive ping 之間的最小間隔,若小于這個(gè)間隔酗捌,則會關(guān)閉與客戶端的鏈接
// 默認(rèn)是5分鐘
MinTime
// 沒有 active stream, 也允許 ping
// 如果為 false呢诬,并且客戶端在沒有活動(dòng)流時(shí)發(fā)送 ping,服務(wù)器將發(fā)送 GoAway 并關(guān)閉連接
PermitWithoutStream
客戶端:
gRPC 客戶端參數(shù):
// 在時(shí)間范圍內(nèi)無消息來往胖缤,即鏈接空閑尚镰,則會發(fā)送一個(gè)ping 檢查鏈接是否還存在
// 默認(rèn)是無窮
// 最小值是10秒
Time
// 在發(fā)送一個(gè)keepalive 的ping 時(shí),若Timeout 的時(shí)間內(nèi)未ack 哪廓,則會斷開鏈接
Timeout
// 沒有 active stream, 也允許 ping
PermitWithoutStream