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