乐趣区

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/liangx…

退出移动版