dubbo超時與超時後自動重複呼叫的問題
阿新 • • 發佈:2019-01-23
問題陳述:
工作中遇到一個問題,服務一通過dubbo呼叫服務2,問題是最終結果是服務一最終成功了,但是服務二被執行了兩次。
問題分析
通過分析報文可以發現,服務二被呼叫了兩次,兩次訪問時間間隔為3秒,並且都成功了。
而在服務一這邊的日誌顯示,有一個dubbo服務呼叫超時的異常,然後雖然超時了,但在3秒多的時候又返回了結果,提示warn,然後按照正常的流程走了下去。
最終就是服務一成功執行一次,雖然中間報了超時異常,服務二被呼叫了兩次。
問題解決原理-dubbo超時重連機制
dubbo有這樣幾個機制
1、如果超時,但是最終返回了正確結果,只是warn,依舊按照正常流程走下去。
2、dubbo:provider 可以設定超時時間 timout,以及如果超時允許被重連的次數 retries
3、dubbo:reference 可以設定超時時間,以及如果超時 timout,允許重連服務的次數 retries
4、dubbo:reference retries 的預設值和consumer一樣,而consumer預設為2次
<dubbo:consumer> | retries | default.retries | int | 可選 | 2 |
5、說明客戶端的配置優先順序高於服務端的優先順序。
問題解決實踐-自己重新配置
1、我的dubbo:provider timeout 是3000 即3秒,而實際呼叫時3秒多一些,所以把這個延長到60000,當然更長也可以,retries="0",保持不變
2、我的dubbo:reference timeout 沒有配置,retries也沒有配置,現在這兩個屬性也配置為 timout=“60000” retries="0"