并发控制
actives参数
CONSUMER端配置, ActiveLimitFilter里, count.wait(remain); 线程wait方式, 配合 timeout 配置, 需要配置 actives 参数才会开启 ActiveLimitFilter,应该是为了性能考虑
executes参数
PROVIDER端配置,ExecuteLimitFilter里,信号量的方式,限制方法级别的并发调用
如果要统计调用数呢?
RpcStatus.SERVICE_STATISTICS 记录了service级别的计数
RpcStatus.METHOD_STATISTICS 记录了method级别的计数
需要配置 executes 参数才会开启 ExecuteLimitFilter,应该是为了性能考虑
todo: Semaphore.tryAcquire(), 并没有使用 tryAcquire(long timeout, TimeUnit unit) ,超时怎么控制
挑2个不太好的地方
1. RpcStatus.METHOD_STATISTICS = new ConcurrentHashMap<String, ConcurrentMap<String, RpcStatus>>();
String = dubbo://10.1.9.55:20800/com.alibaba.boot.dubbo.service.IHelloService
如果是 dubbo://10.1.9.55:20800/com.alibaba.boot.dubbo.service.IHelloService/consumser 会不会好点, 一个项目有provider,也有consumser,这样就分开了
2. 泛化调用, method key = '$invoke' , 也可以改进
连接控制
服务端配置 accepts参数
TomcatHttpServer 里
tomcat.getConnector().setProperty(
"maxConnections", String.valueOf(url.getParameter(Constants.ACCEPTS_KEY, -1)));
NettyServer里
if (accepts > 0 && channels.size() > accepts) {
logger.error("Close channel " + ch + ", cause: The server " + ch.getLocalAddress() + " connections greater than max config " + accepts);
ch.close();
return;
}
客户端配置 connections 参数
1.DubboProtocol . getClients
2. RestProtocol 里 connectionManager.setMaxTotal(url.getParameter(Constants.CONNECTIONS_KEY, 20));
3. ThriftProtol 里 new ExchangeClient[connections];
总结
1. 并发控制和连接控制只需要配置1种就好,并发控制较好一些
2. 并发控制配置时注意cluster的配置