1. 程式人生 > >關於dubbo的provider和consumer都配置timeout超時時間的情況

關於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端屬性
原因如下:

  1. 作服務的提供者,比服務使用方更清楚服務效能引數,如呼叫的超時時間,合理的重試次數,等等
  2. 在Provider配置後,Consumer不配置則會使用Provider的配置值,即Provider配置可以作為Consumer的預設值。否則,Consumer會使用Consumer端的全域性設定,這對於Provider不可控的,並且往往是不合理的
  3. 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端屬性有:

  1. timeout,方法呼叫超時
  2. retries,失敗重試次數,預設是2(表示加上第一次呼叫,會呼叫3次)
  3. loadbalance,負載均衡演算法(有多個Provider時,如何挑選Provider呼叫),預設是隨機(random)。還可以有輪訓(roundrobin)、最不活躍優先(leastactive,指從Consumer端併發呼叫最好的Provider,可以減少的反應慢的Provider的呼叫,因為反應更容易累積併發的呼叫)
  4. 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端屬性有:

  1. threads,服務執行緒池大小
  2. executes,一個服務提供者並行執行請求上限,即當Provider對一個服務的併發呼叫到上限後,新呼叫會Wait(Consumer可能到超時)。在方法上配置(dubbo:method )則併發限制針對方法,在介面上配置(dubbo:service),則併發限制針對服務。