當咱們鏈接到一個失敗的後端時,一般但願不要當即重試(以免氾濫的網絡或服務器的請求),而是作某種形式的指數backoff。golang
咱們有幾個參數:算法
以指數形式返回鏈接嘗試的起始時間,達到MAX_BACKOFF的極限,並帶有抖動。後端
1 |
ConnectWithBackoff() |
參數默認值MIN_CONNECT_TIMEOUT
=20sec INITIAL_BACKOFF
=1sec MULTIPLIER
=1.6 MAX_BACKOFF
=120sec JITTER
=0.2服務器
根據的確切的關注點實現(例如最小化手機的喚醒次數)可能但願使用不一樣的算法,特別是不一樣的抖動邏輯。網絡
備用的實現必須確保鏈接退避在同一時間開始分散,而且不得比上述算法更頻繁地嘗試鏈接。dom
backoff應在某個時間點重置爲INITIAL_BACKOFF
,以便從新鏈接行爲是一致的,無論鏈接的是新開始的仍是先前斷開的鏈接。google
當接收到SETTINGS
幀時重置backoff,在那個時候,咱們肯定這個鏈接被服務器已經接受了。spa
源碼位於google.golang.org/grpc/backoff
,代碼很少,直接在代碼上分析。code
1 |
|
若是默認的backoff算法不知足需求的時候,還能夠自定義backoff算法,經過實現backoffStrategy接口。orm
1 |
func withBackoff(bs backoffStrategy) DialOption { |