為了防止某個消費者的QPS或是所有消費者的QPS總和突然飆升而導致的重要服務的失效,系統可以對訪問流量進行控制,這種對集群的保護措施稱為服務限流。
Dubbo中能夠實現服務限流的方式較多,可以划分為兩類:直接限流與間接限流
- 直接限流:通過對連接數量直接進行限制來達到限流的目的。(官方方案匯總)
- 間接限流:通過一些非連接數量設置來達到限制流量的目的。(我的偶像總結-Reythor雷)
一、executes直接限流– 僅提供者端
該屬性僅能設置在提供者端。可以設置為接口級別,也可以設置為方法級別。限制的是服務(方法)並發執行數量。
類級別,服務器端並發執行(或占用線程池線程數)不能超過 10 個
<dubbo:service interface="com.foo.BarService" executes="10" />
方法級別,服務器端並發執行(或占用線程池線程數)不能超過 10 個
-
<dubbo:service interface="com.foo.BarService">
-
<dubbo:method name="sayHello" executes="10" />
-
</dubbo:service>
二、accepts限流 – 僅提供者端
該屬性僅可設置在提供者端的<dubbo:provider/>與<dubbo:protocol/>。用於對指定協議的連接數量進行限制
或
三、actives限流 – 兩端
該限流方式與前兩種不同的是,其可以設置在提供者端,也可以設置在消費者端。可以設置為接口級別,也可以設置為方法級別
A、提供者端限流
根據消費者與提供者間建立的連接類型的不同,其意義也不同
- 長連接:表示當前長連接最多可以處理的請求個數。與長連接的數量沒有關系
- 短連接:表示當前服務可以同時處理的短連接數量
類級別
<dubbo:service interface="com.foo.BarService" actives="10" />
方法級別
-
<dubbo:reference interface="com.foo.BarService">
-
<dubbo:method name="sayHello" actives="10" />
-
</dubbo:service>
B、消費者端限流
根據消費者與提供者間建立的連接類型的不同,其意義也不同:
- 長連接:表示當前消費者所發出的長連接中最多可以提交的請求個數。與長連接的數量沒有關系。
- 短連接:表示當前消費者可以提交的短連接數量
類級別
<dubbo:reference interface="com.foo.BarService" actives="10" />
方法級別
-
<dubbo:reference interface="com.foo.BarService">
-
<dubbo:method name="sayHello" actives="10" />
-
</dubbo:service>
四、 connections限流
可以設置在提供者端,也可以設置在消費者端。限定連接的個數。對於短連接,該屬性效果與actives相同。但對於長連接,其限制的是長連接的個數。
一般情況下,會使connectons與actives聯用,讓connections限制長連接個數,讓actives限制一個長連接中可以處理的請求個數。聯用前提:使用默認的Dubbo服務暴露協議
A、提供者端限流
類級別
方法級別
B、消費者端限流
類級別
方法級別
五、間接限流
(1) 延遲連接 – 僅消費者端
僅可設置在消費者端,且不能設置為方法級別。僅作用於Dubbo服務暴露協議。
將長連接的建立推遲到消費者真正調用提供者時。
可以減少長連接的數量
-
<!--設置當前消費者對接口中的每個方法發出鏈接采用延遲加載-->
-
<dubbo:reference id="userService" lazy="true"
-
interface=
"com.dubbo.service.UserService"/>
-
<!--設置當前消費者對所有接口中的所有方法發出鏈接采用延遲加載-->
-
<dubbo:consumer lazy="true">
</dubbo:consumer>
六、粘連連接 – 僅消費者
僅能設置在消費者端,其可以設置為接口級別,也可以設置為方法級別。僅作用於Dubbo服務暴露協議
其會使客戶端盡量向同一個提供者發起調用,除非該提供者掛了,其會連接另一台。只要啟用了粘連連接,其就會自動啟用延遲連接
其限制的是流向,而非流量
類級別
方法級別
七、負載均衡
可以設置在消費者端,亦可設置在提供者端;可以設置在接口級別,亦可設置在方法級別。其限制的是流向,而非流量
官方介紹
http://dubbo.apache.org/zh-cn/docs/user/demos/concurrency-control.html