Dubbo(七)限流之actives參數


actives參數隸屬於標簽dubbo:reference,是客戶端獨有的參數。它的官方定義是“每服務消費者每服務每方法最大並發調用數”。

示例代碼在 https://github.com/ralgond/dubbo-example/releases/tag/v0.0.7

v0.0.7增加了一個類來測試ApiSleepConsumerTwoThreads來測試參數actives。代碼如下:

public class ApiSleepConsumerTwoThreads {

	public static class ConsumerThread extends Thread {
		GreetingService service;
		public ConsumerThread(GreetingService service, int id) {
			super(""+id);
			this.service = service;
			
		}
		public void run() {
			long begin = System.currentTimeMillis();
			System.out.println("["+this.getName()+"] begin:"+begin+" ");
			service.sleepMs(3000);
			long end = System.currentTimeMillis();
			System.out.println("["+this.getName()+"] end  :"+end+ " eclapsed: "+(end - begin)+"ms");
		}
	}
	
	public static void main(String args[]) {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
		context.start();
		
		GreetingService service = (GreetingService)context.getBean("greetingService");
		
		ConsumerThread t1 = new ConsumerThread(service, 1);
		ConsumerThread t2 = new ConsumerThread(service, 2);
		t1.start();
		t2.start();
		
		try {
			t1.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		try {
			t2.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
	}
}

ApiSleepConsumerTwoThreads啟動后,會創建兩條線程,線程啟動后會調用接口GreetingService.sleepMs。

我們先不設置actives,並設置connections為1,也即是只和服務端保持一條連接,配置如下:

<dubbo:reference id="greetingService" interface="com.github.ralgond.de.sdk.GreetingService" group="dubbo" version="0.0.1"
    	timeout="30000" connections="1" check="false"/>

啟動ApiSleepConsumerTwoThreads,Console會打印:

[1] begin:1605411200246 
[2] begin:1605411200246 
[1] end  :1605411203313 eclapsed: 3067ms
[2] end  :1605411203313 eclapsed: 3067ms

可見[1605411200246,1605411203313]和[1605411200246,1605411203313]是重疊的,也就是說即便是只有一條連接,客戶端的請求也會並行地執行。

接下來我們設置actives為1(最大並行數為1),並設置connections為2,也即是和服務端保持兩條連接,配置如下:

<dubbo:reference id="greetingService" interface="com.github.ralgond.de.sdk.GreetingService" group="dubbo" version="0.0.1"
    	timeout="30000" connections="2" check="false" actives="1"/>

啟動ApiSleepConsumerTwoThreads,Console會打印:

[1] begin:1605411404151 
[2] begin:1605411404151 
[2] end  :1605411407213 eclapsed: 3062ms
[1] end  :1605411410220 eclapsed: 6069ms

可見兩個線程並不是並行地請求服務端,而是串行地訪問,即使是和服務端有多條連接的情況下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM