dubbo啟動時默認有重試機制和超時機制。
超時機制的規(guī)則是如果在一定的時間內(nèi),provider沒有返回,則認為本次調(diào)用失敗,
重試機制在出現(xiàn)調(diào)用失敗時,會再次調(diào)用。如果在配置的調(diào)用次數(shù)內(nèi)都失敗,則認為此次請求異常,拋出異常。
如果出現(xiàn)超時,通常是業(yè)務(wù)處理太慢,可在服務(wù)提供方執(zhí)行:jstack PID > jstack.log 分析線程都卡在哪個方法調(diào)用上,這里就是慢的原因。
如果不能調(diào)優(yōu)性能,請將timeout設(shè)大。
某些業(yè)務(wù)場景下,如果不注意配置超時和重試,可能會引起一些異常。
- 超時設(shè)置
DUBBO消費端設(shè)置超時時間需要根據(jù)業(yè)務(wù)實際情況來設(shè)定,
如果設(shè)置的時間太短,一些復(fù)雜業(yè)務(wù)需要很長時間完成,導(dǎo)致在設(shè)定的超時時間內(nèi)無法完成正常的業(yè)務(wù)處理。
這樣消費端達到超時時間,那么dubbo會進行重試機制,不合理的重試在一些特殊的業(yè)務(wù)場景下可能會引發(fā)很多問題,需要合理設(shè)置接口超時時間。
比如發(fā)送郵件,可能就會發(fā)出多份重復(fù)郵件,執(zhí)行注冊請求時,就會插入多條重復(fù)的注冊數(shù)據(jù)。-
合理配置超時和重連的思路
- 對于核心的服務(wù)中心,去除dubbo超時重試機制,并重新評估設(shè)置超時時間.
2.業(yè)務(wù)處理代碼必須放在服務(wù)端,客戶端只做參數(shù)驗證和服務(wù)調(diào)用,不涉及業(yè)務(wù)流程處理
Dubbo超時和重連配置示例
<!-- 服務(wù)調(diào)用超時設(shè)置為5秒,超時不重試--> <dubbo:service interface="com.provider.service.DemoService" ref="demoService" retries="0" timeout="5000"/> -
- 重連機制
dubbo在調(diào)用服務(wù)不成功時,默認會重試2次。
Dubbo的路由機制,會把超時的請求路由到其他機器上,而不是本機嘗試,所以 dubbo的重試機器也能一定程度的保證服務(wù)的質(zhì)量。
但是如果不合理的配置重試次數(shù),當(dāng)失敗時會進行重試多次,這樣在某個時間點出現(xiàn)性能問題,調(diào)用方再連續(xù)重復(fù)調(diào)用,
系統(tǒng)請求變?yōu)檎V档膔etries倍,系統(tǒng)壓力會大增,容易引起服務(wù)雪崩,需要根據(jù)業(yè)務(wù)情況規(guī)劃好如何進行異常處理,何時進行重試。