服務失敗后如何重試?你學會了嗎?
在分布式系統和網絡應用程序中,重試策略對于有效處理瞬時錯誤和網絡不穩定性至關重要。
重試策略能讓系統在發生故障時多次嘗試操作,從而提高最終成功的可能性。
下圖顯示了 4 種常見的重試策略。
圖片
1.線性回退
線性回退是指在重試嘗試之間等待一個逐漸增加的固定時間間隔。例如,如果初始重試間隔設置為 1 秒,則后續重試間隔可能為 2 秒、3 秒、4 秒,依此類推,每次重試后都會增加固定時間。
優點
易于實施和理解。提供可預測的重試模式。
缺點
在高負載或高并發環境下可能并不理想,因為它可能導致資源爭用或 “重試風暴”,因為重試間隔是可預測的,并且僅呈線性增長。
2.線性抖動回退
線性抖動回退修改了線性回退策略,在重試間隔中引入了隨機性。該策略仍線性增加延遲,但在每個間隔中添加了隨機 “抖動”。例如,如果基本延遲為 3 秒,抖動可以是-1 到 1 秒之間的隨機值,從而導致實際延遲為 2 秒、3 秒或 4 秒。
優點
隨機性有助于在一段時間內分散重試嘗試,減少跨實例同步重試的機會,這在分布式系統中尤其有用。
缺點
雖然這種策略比簡單的線性后退要好,但仍可能導致同步重試的潛在問題,因為基本間隔僅線性增加。
3.指數回退
指數后退是指以指數方式增加重試之間的延遲。間隔時間可能從 1 秒開始,然后增加到 2 秒、4 秒、8 秒,依此類推,通常會達到最大延遲。這種方法在間隔重試方面比線性延遲更積極。
優點
大大減輕了系統負荷,降低了重試中發生碰撞或重疊的可能性,因此適用于高負荷環境。
缺點
在快速重試可能解決問題的情況下,這種方法可能會不必要地延遲問題的解決。
4.指數抖動回退
指數抖動回退結合了指數回退和隨機性。每次重試后,回退間隔以指數形式增加,然后應用隨機抖動。抖動可以是加法(在指數延遲上添加一個隨機量)或乘法(將指數延遲乘以一個隨機因子)。這種隨機性有助于進一步防止普通指數退避中出現的同步問題。
優點
具有指數延遲的所有優點,由于引入了抖動,還能進一步減少重試碰撞。
缺點
隨機性有時會導致超過必要的延遲時間,尤其是在抖動顯著的情況下。
選擇重試策略
重試策略的選擇應基于以下因素:
- 系統負載和性能要求:指數(帶或不帶抖動)等更激進的重試策略可能更適合負載較重的系統。
- 錯誤類型:對于快速重試可能會成功的瞬時錯誤,采用不那么激進的策略可能就足夠了。
- 網絡條件和服務依賴性:在多個服務相互依賴的分布式系統中,指數抖動回退等更復雜的策略有助于平滑需求峰值,減少下游服務的負載。
每種策略都可以通過最大重試次數、最大回退限制和抖動程度等參數進行調整,以根據應用的具體要求和運行條件定制回退行為。