vlambda博客
学习文章列表

dubbo-客户端请求连接并发数量监控

实现

步骤
1.配置
开启监控功能

2.代码
dubbo提供了RpcStatus类,读监控数据。我们可以自定义dubbo拦截器,然后在拦截器里打印监控数据。

配置

为什么要配置?
因为dubbo自带了监控,我们要做的只是使用,很多框架都是自带了监控(比如阿里的druid数据库连接池),一般来说就是使用即可。


如何配置?

### dubbo线程池调优 #### 作为提供者,单个方法接收的最大并发请求数量(所有消费者)dubbo.provider.executes=200# 作为提供者,单个方法接收的最大并发请求数量(单个消费者)dubbo.provider.actives=200# 作为消费者,调用远程方法的最大并发请求数量dubbo.consumer.actives=200

说明
这几个参数本来是调优的作用,因为一般情况下只需要配置线程池的数量即可,但是如果想要限制单个方法或单个客户端的并发请求数量,从而避免单个服务或单个客户端把系统拖垮,就可以配置以上的几个参数。配置了之后,就自动开启了监控功能。

代码

自定义dubbo拦截器类

if ("provider".equals(side)) { //只在提供者打印监控数据,因为监控一般都是在服务器端
//dubbo请求连接数量监控 RpcStatus status = RpcStatus.getStatus(invoker.getUrl(), inv.getMethodName()); URL url = invoker.getUrl(); String methodName = inv.getMethodName(); int max = url.getMethodParameter(methodName, "executes", 0); if (max <= 0) { max = url.getMethodParameter(methodName, "default.executes", 0); } int left = max - status.getActive(); logger.info("dubbo status:[method:{},status:{},max:{},left:{}]", new Object[]{methodName, JSONObject.toJSONString(status), max, left});

字段说明

测试数据

2020-07-09 16:52:22.286|INFO |dw4Vq9rvpwaA-61-0|xxx.common.filter.dubbo.AccessLogExtFilter.invoke:167||dubbo status:[method:getQrcodeInfoById,status:{"active":9,"averageElapsed":1252,"averageTps":0,"failed":0,"failedAverageElapsed":0,"failedElapsed":0,"failedMaxElapsed":0,"maxElapsed":1258,"succeeded":42,"succeededAverageElapsed":1252,"succeededElapsed":52611,"succeededMaxElapsed":1258,"total":42,"totalElapsed":52611},max:200,left:191]
2020-07-09 16:52:22.287|INFO |xypAIqCmPDQ4-22-11|xxx.common.filter.dubbo.AccessLogExtFilter.invoke:167||dubbo status:[method:getQrcodeInfoById,status:{"active":2, //当前活跃的请求连接数量"averageElapsed":1252, //平均耗时"averageTps":0, //每秒请求数量"failed":0, //失败数量"failedAverageElapsed":0, //失败平均耗时"failedElapsed":0, //失败请求总耗时"failedMaxElapsed":0, //失败请求的最大耗时"maxElapsed":1258, //最大耗时 "succeeded":49, //成功请求数量"succeededAverageElapsed":1252, //成功平均耗时"succeededElapsed":61388, //请求成功总耗时"succeededMaxElapsed":1258, //成功请求的最大耗时"total":49 //总的请求次数(当前统计数据不包含当前请求,是之前的请求之和)"totalElapsed":61388 //总耗时},
max:200, //execute拦截器的数量left:198 //剩余可使用的连接数量 = max - activce]

说明
监控结果示例(监控数据是在当前请求之前的数据,不包括本次的,活跃连接数,成功数都要少一个)。

测试的时候,这几个拦截器配置的数量是200

### dubbo线程池调优 #### 作为提供者,单个方法接收的最大并发请求数量(所有消费者)dubbo.provider.executes=200# 作为提供者,单个方法接收的最大并发请求数量(单个消费者)dubbo.provider.actives=200# 作为消费者,调用远程方法的最大并发请求数量dubbo.consumer.actives=200

所以

"total":49 //总的请求次数(当前统计数据不包含当前请求,是之前的请求之和)。
max:200, //execute拦截器的数量left:198 //剩余可使用的连接数量 = max - activce

本质

dubbo提供了监控功能,其实就是拦截器功能,

原理

开启监控功能,需要前置开通服务消费方的最大连接数和服务提供方的最大连接数。服务消费方的连接数打开会带来影响,每一次请求都会过一遍ActiveLimitFilter,检查并发数是否超过最大并发数,超过了就等待,直至超时;

服务提供方每一次请求会过一遍ExecuteLimitFilter,检查并发数是否超过最大并发数,超过最大并发数直接异常。

参考

https://my.oschina.net/liangxiao/blog/1633841