dubbo啟動(dòng)時(shí)默認(rèn)有重試機(jī)制和超時(shí)機(jī)制栅盲。
超時(shí)機(jī)制的規(guī)則是如果在一定的時(shí)間內(nèi),provider沒(méi)有返回废恋,則認(rèn)為本次調(diào)用失敗谈秫,
重試機(jī)制在出現(xiàn)調(diào)用失敗時(shí),會(huì)再次調(diào)用鱼鼓。如果在配置的調(diào)用次數(shù)內(nèi)都失敗拟烫,則認(rèn)為此次請(qǐng)求異常,拋出異常迄本。
如果出現(xiàn)超時(shí)硕淑,通常是業(yè)務(wù)處理太慢,可在服務(wù)提供方執(zhí)行:jstack PID > jstack.log 分析線程都卡在哪個(gè)方法調(diào)用上,這里就是慢的原因置媳。
如果不能調(diào)優(yōu)性能于樟,請(qǐng)將timeout設(shè)大。
某些業(yè)務(wù)場(chǎng)景下拇囊,如果不注意配置超時(shí)和重試迂曲,可能會(huì)引起一些異常。
- 超時(shí)設(shè)置
DUBBO消費(fèi)端設(shè)置超時(shí)時(shí)間需要根據(jù)業(yè)務(wù)實(shí)際情況來(lái)設(shè)定寥袭,
如果設(shè)置的時(shí)間太短路捧,一些復(fù)雜業(yè)務(wù)需要很長(zhǎng)時(shí)間完成,導(dǎo)致在設(shè)定的超時(shí)時(shí)間內(nèi)無(wú)法完成正常的業(yè)務(wù)處理传黄。
這樣消費(fèi)端達(dá)到超時(shí)時(shí)間杰扫,那么dubbo會(huì)進(jìn)行重試機(jī)制,不合理的重試在一些特殊的業(yè)務(wù)場(chǎng)景下可能會(huì)引發(fā)很多問(wèn)題膘掰,需要合理設(shè)置接口超時(shí)時(shí)間章姓。
比如發(fā)送郵件,可能就會(huì)發(fā)出多份重復(fù)郵件炭序,執(zhí)行注冊(cè)請(qǐng)求時(shí)啤覆,就會(huì)插入多條重復(fù)的注冊(cè)數(shù)據(jù)。-
合理配置超時(shí)和重連的思路
- 對(duì)于核心的服務(wù)中心惭聂,去除dubbo超時(shí)重試機(jī)制窗声,并重新評(píng)估設(shè)置超時(shí)時(shí)間.
2.業(yè)務(wù)處理代碼必須放在服務(wù)端,客戶端只做參數(shù)驗(yàn)證和服務(wù)調(diào)用辜纲,不涉及業(yè)務(wù)流程處理
Dubbo超時(shí)和重連配置示例
<!-- 服務(wù)調(diào)用超時(shí)設(shè)置為5秒,超時(shí)不重試--> <dubbo:service interface="com.provider.service.DemoService" ref="demoService" retries="0" timeout="5000"/>
-
- 重連機(jī)制
dubbo在調(diào)用服務(wù)不成功時(shí)笨觅,默認(rèn)會(huì)重試2次。
Dubbo的路由機(jī)制耕腾,會(huì)把超時(shí)的請(qǐng)求路由到其他機(jī)器上见剩,而不是本機(jī)嘗試,所以 dubbo的重試機(jī)器也能一定程度的保證服務(wù)的質(zhì)量扫俺。
但是如果不合理的配置重試次數(shù)苍苞,當(dāng)失敗時(shí)會(huì)進(jìn)行重試多次,這樣在某個(gè)時(shí)間點(diǎn)出現(xiàn)性能問(wèn)題狼纬,調(diào)用方再連續(xù)重復(fù)調(diào)用羹呵,
系統(tǒng)請(qǐng)求變?yōu)檎V档膔etries倍,系統(tǒng)壓力會(huì)大增疗琉,容易引起服務(wù)雪崩冈欢,需要根據(jù)業(yè)務(wù)情況規(guī)劃好如何進(jìn)行異常處理,何時(shí)進(jìn)行重試盈简。