dubbo 并发控制和连接控制

并发控制

            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 = 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的配置


你可能感兴趣的:(dubbo 并发控制和连接控制)