超時:如果不設置超時時間,慢請求累積導致連鎖反應,造成應用雪崩。超時主要處理的是網絡連接和讀寫超時
重試:重試次數不能太多,否則會把請求數放大數倍,應該和熔斷、快速失敗機制配合
6.2 代理層超時與重試
6.2.1 Nginx
提供了 客戶端超時設置、DNS解析超時設置、代理超時設置、Lua相關超時設置
6.3 Web容器超時
比如Tomcat 8.5
1. 建立連接和接收請求之間的等待超時時間,默認60秒
2. 從客戶端讀取請求數據的超時時間,默認60秒
3. Servlet3異步請求超時時間,默認30秒
4. 文件上傳超時時間
5. http長連接超時時間
6.4 中間件客戶端超時與重試
6.5 數據庫客戶端超時
數據庫連接池超時設置
6.6 NoSQL客戶端超時
比如redis獲取連接池連接的超時時間和讀超時時間
6.7 業務超時
1. 任務型:訂單超時未支付,通過Worker定期掃描數據庫更改狀態。
2. 服務調用型:遠程調用超時,設置調用的等待時間
6.8 前端Ajax超時
在請求時帶上timeout參數設置超時時間
6.9 總結
通過配置超時時間,防止因為依賴系統超時而拖垮自己的服務。
當出現多級依賴關系,如A調用B,B調用C,那么超時時間一般應該是A>B>C,否則可能會一直重試。
超時之后的處理策略:
重試:等待並重試,重試其他分組/機房服務
托底:返回歷史數據/緩存數據
等待頁/錯誤頁
對於寫服務,如果對方不支持冪等,則不應該重試。
對於重試時間的設置,太短會造成大量失敗的重復請求,太長會影響用戶體驗。