關於dubbo的provider和consumer都配置timeout超時時間的情況
在dubbo的provider和consumer的配置檔案中,如果都配置了timeout的超時時間,dubbo預設以consumer中配置的時間為準(經 坤哥玩CSDN 提醒,之前說以provider為準是錯誤的)。
經驗證是這樣的,
provider.xml的配置:
<dubbo:service timeout="4000" retries="0" interface="com.dingding.tms.bms.service.BillingZfbCodOrderService" ref="billingZfbCodOrderService" registry="globalRegistry"/>
conusmer中的配置:
<dubbo:reference id="billingInterService" interface="com.dingding.tms.bms.service.BillingInterService" protocol="dubbo" check="false" registry="globalRegistry" timeout="3000"/>
最後這個service在呼叫時的超時時間就是3秒。
另外,
1,consumer會在超過3秒時得到一個呼叫超時的異常。
2,provider中程式碼的執行不會因為超時而中斷,在執行完畢後,會得到一個dubbo的警告。
在dubbo的使用者手冊中,對配置有這樣的推薦用法:
在Provider上儘量多配置Consumer端屬性
原因如下:
- 作服務的提供者,比服務使用方更清楚服務效能引數,如呼叫的超時時間,合理的重試次數,等等
- 在Provider配置後,Consumer不配置則會使用Provider的配置值,即Provider配置可以作為Consumer的預設值。否則,Consumer會使用Consumer端的全域性設定,這對於Provider不可控的,並且往往是不合理的
- PS: 配置的覆蓋規則:1) 方法級配置別優於介面級別,即小Scope優先 2) Consumer端配置 優於 Provider配置 優於 全域性配置,最後是Dubbo Hard Code的配置值(見配置文件)
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService"
timeout="300" retry="2" loadbalance="random" actives="0"/>
<dubbo:service interface="com.alibaba.hello.api.WorldService" version="1.0.0" ref="helloService"
timeout="300" retry="2" loadbalance="random" actives="0" >
<dubbo:method name="findAllPerson" timeout="10000" retries="9" loadbalance="leastactive" actives="5" />
<dubbo:service/>
在Provider可以配置的Consumer端屬性有:
- timeout,方法呼叫超時
- retries,失敗重試次數,預設是2(表示加上第一次呼叫,會呼叫3次)
- loadbalance,負載均衡演算法(有多個Provider時,如何挑選Provider呼叫),預設是隨機(random)。還可以有輪訓(roundrobin)、最不活躍優先(leastactive,指從Consumer端併發呼叫最好的Provider,可以減少的反應慢的Provider的呼叫,因為反應更容易累積併發的呼叫)
- actives,消費者端,最大併發呼叫限制,即當Consumer對一個服務的併發呼叫到上限後,新呼叫會Wait直到超時。在方法上配置(dubbo:method )則併發限制針對方法,在介面上配置(dubbo:service),則併發限制針對服務。
Provider上配置合理的Provider端屬性
比如:
<dubbo:protocol threads="200" />
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService"
executes="200" >
<dubbo:method name="findAllPerson" executes="50" />
</dubbo:service>
Provider上可以配置的Provider端屬性有:
- threads,服務執行緒池大小
- executes,一個服務提供者並行執行請求上限,即當Provider對一個服務的併發呼叫到上限後,新呼叫會Wait(Consumer可能到超時)。在方法上配置(dubbo:method )則併發限制針對方法,在介面上配置(dubbo:service),則併發限制針對服務。