`

Least Activity LoadBalance配置

 
阅读更多

背景:

 

前段时间,发生了某个服务节点发生问题,被阻塞时,影响了整套系统的运行。期望在运行的时候,当某个节点发生问题的时候,上级服务可以调用另一个可以节点,不会影响整套系统。

 

分析:

主要是不可用节点阻塞达30秒以上,我们使用的是random loadbalance的负载均衡策略。上级应用不断的调用不可用节点,导致被阻塞的调用越来越多,一直到报线程用完错误。

 

猜想可解决的方案:

1. 对于一些耗时少的服务,上级应用应该设置比较短的timeout时间,然后设置retry为下级节点数,这样就可以无失败次数

 

2.对于耗时长的服务,上级应用需要设置长的timeout时间,这时可以设置loadbalance为leastactivity

 

配置示例:

<dubbo:reference id="helloWorldService" interface="IHelloWorldService" group="test" timeout="5000" loadbalance="leastactive" actives="200"/>

在Consumer上需要添加loadbalance和actives, actives表示Activity最大的并发数,如果超过这个并发数,在invoke时将会等待。Activity的代码如下所示:

 

   int max = invoker.getUrl().getMethodParameter(methodName, Constants.ACTIVES_KEY, 0);
        RpcStatus count = RpcStatus.getStatus(invoker.getUrl(), invocation.getMethodName());
        if (max > 0) {
            long timeout = invoker.getUrl().getMethodParameter(invocation.getMethodName(), Constants.TIMEOUT_KEY, 0);
            long start = System.currentTimeMillis();
            long remain = timeout;
            int active = count.getActive();
            if (active >= max) {
                synchronized (count) {
                    while ((active = count.getActive()) >= max) {
                        try {
                            count.wait(remain);
                        } catch (InterruptedException e) {
                        }
                        long elapsed = System.currentTimeMillis() - start;
                        remain = timeout - elapsed;
                        if (remain <= 0) {
                            throw new RpcException("Waiting concurrent invoke timeout in client-side for service:  "
                                                   + invoker.getInterface().getName() + ", method: "
                                                   + invocation.getMethodName() + ", elapsed: " + elapsed
                                                   + ", timeout: " + timeout + ". concurrent invokes: " + active
                                                   + ". max concurrent invoke limit: " + max);
                        }
                    }
                }
            }
        }

 

 

测试:

 

案例1: Consumer 设置为5秒超时,每100毫秒,并发发送100个请求,总共执行150次,预计15秒测试完成。loadbalance策略为Random. Retry次数为0.

              Provider 1:每个请求sleep 10毫秒

              Provider 2:每个请求sleep 10秒

           

          结果:

           Consumer: 总调用次数:15000,成功次数:7460,错误次数:7540,耗时:131227毫秒

           Provider1: 执行总数为7460

           Provider2: 执行总数为2590,其他请求都报“Thread pool is EXHAUSTED”异常

 

案例2: Consumer 设置为5秒超时,每100毫秒,并发发送100个请求,总共执行150次,loadbalance策略为Random. Retry次数为1.

              Provider 1:每个请求sleep 10毫秒

              Provider 2:每个请求sleep 10秒

           

          结果:

           Consumer: 总调用次数:15000,成功次数:15000,错误次数:0,耗时:129134毫秒

           Provider1: 执行总数为15000

           Provider2: 执行总数为2600

 

 

案例3: Consumer 设置为5秒超时,每100毫秒,并发发送100个请求,总共执行150次,loadbalance策略为LeastActivity. Retry次数为1.

              Provider 1:每个请求sleep 10毫秒

              Provider 2:每个请求sleep 10秒

           

          结果:

           Consumer: 总调用次数:15000,成功次数:15000,错误次数:0,耗时:17975毫秒

           Provider1: 执行总数为15000

           Provider2: 执行总数为308

 

分析:案例1中错误总数和成功总数差不多一致,因为retry为0,50%请求发送到

 provider2,发送错误的时候未重试

         

            案例2中错误总数为0,但是耗时明显增长,花费了2分钟时间处理15000次请求。QPS下降。

           

            案例3中错误总数为0,耗时为17秒,和预计的相近。

 

           总结:leastactivity的loadbalance可以在发生故障的时候,保证QPS和可靠性。但是配置了leastactivity之后,权重的配置将会失效。建议配置重试次数,对于时耗短的应用,上级应用的超时时间要配置尽量短。

         

 

 

分享到:
评论

相关推荐

    Fortigate Load Balance

    ### Fortigate Load Balance 实用手册知识点详述 #### 引言 Fortigate Load Balance 是一款由Fortinet公司研发的企业级负载均衡解决方案。本手册旨在帮助用户深入理解Fortigate的负载均衡功能及其配置方法,适用于...

    Tomcat5基于JK的集群(Cluster)和负载平衡(Load Balance)

    标题"Tomcat5基于JK的集群(Cluster)和负载平衡(Load Balance)"提及了两个核心概念:Tomcat集群和负载平衡。Tomcat是Apache软件基金会的开源Java Servlet容器,用于部署和运行Java web应用程序。集群是在多台...

    Dubbo负载均衡策略.docx

    3. **最少活跃调用数负载均衡(Least Active Load Balance)** 这种策略会优先选择当前处理请求最少的服务提供者。这样可以避免繁忙的节点被更多的请求淹没,而空闲的节点则能更好地利用其资源。 4. **权重轮询...

    dubbo服务限流与负载均衡

    3. **Least Active Load Balance(最少活跃调用数)**:根据服务提供者的活跃调用数来选择,活跃调用数越少,越优先被选择。 4. **Weighted Response Time Load Balance(响应时间加权)**:根据服务提供者的平均...

    Activity的生命周期(LifeCycle)

    2. **回收Stopped状态的Activity**:如果内存仍然不足,则按照最近最少使用(Least Recently Used, LRU)的原则回收Stopped状态的Activity。 3. **回收Service进程**:如果上述操作后仍不能满足内存需求,则开始回收...

    Balance安装及用法小结

    3. 负载策略:Balance支持多种负载策略,如轮询(round-robin)、最少连接数(least connections)等。根据业务需求选择合适的策略。 4. 部署与测试:修改配置后,重启Balance服务以应用新的配置。通过访问前端IP来...

    asm汇编程序的编写环境

    在IT领域,汇编语言(Assembly)是一种低级编程语言,它与计算机的硬件指令集密切相关,每条汇编指令通常对应一个机器码。汇编程序的编写环境是程序员进行汇编语言编程的重要工具,它提供了编辑、编译、链接等必备...

    least squares_递推最小二乘法_matlab_leastsquares_遗忘因子最小二乘法_最小二乘法_

    最小二乘法(Least Squares)是解决线性回归问题的一种常见方法,广泛应用于数据分析、信号处理和工程领域。在给定的标题和描述中,我们聚焦于几个关键概念:递推最小二乘法(Recursive Least Squares, RLS)、...

    F5负载均衡配置

    * Load Balancing Method:负载均衡算法,包括轮询(RoundRobin)、最少连接(Least Connection)等 * Health Monitors:健康检测类型,包括geteway_icmp、自定义检测端口类型等 四、F5负载均衡应用场景: * 将...

    loadbalancer.org

    - **支持的负载均衡方法**:Loadbalancer.org支持多种负载均衡算法,如轮询(Round Robin)、最少连接(Least Connections)、基于IP的哈希(IP Hash)等。每种算法都有其适用场景,选择合适的算法能够有效提高系统...

    least_leastmeansquare_

    标题中的"least_leastmeansquare_"似乎是指最小均方误差(Least Mean Squares, LMS)算法,这是一种在信号处理和机器学习领域广泛应用的在线优化算法。LMS算法主要用于估计线性系统的参数,尤其是在噪声环境中对未知...

    Least-squares estimation of transformation parameters between tw

    Least-squares estimation of transformation parameters between two point patterns。 相似变换相当于等距变换和均匀缩放的一个复合,即为: 左上角2*2矩阵为旋转部分,右上角为平移因子。它有四个自由度,即旋转...

    Burrus C S. Iterative re-weighted least squares.pdf

    迭代(重)加权最小二乘 论文 Describes a powerful optimization algorithm which iteratively solves a weighted least squares approximation problem in order to solve an L_p approximation problem

    jQuery画廊插件least.js.zip

    在这个例子中,`#gallery` 是包含图片的容器,`least()` 是用于初始化 Least.js 画廊的函数,你可以在此处传入自定义的配置参数。 总的来说,Least.js 是一个适用于前端开发者的实用工具,它可以帮助你快速创建具有...

    PARTIAL LEAST SQUARES ANALYSIS

    Partial Least Squares (PLS) Analysis was first developed in the late 60’s by Herman Wold, and works on the assumption that the focus of analysis is on which aspects of the signal in one matrix are ...

    libPLS for Partial Least Squares总算法matlab代码_matlab

    资源名:libPLS for Partial Least Squares总算法matlab代码_matlab 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者更换。 ...

    Least absolute shrinkage and selection operator(LASSO)

    LASSO是由1996年Robert Tibshirani首次提出,全称Least absolute shrinkage and selection operator。该方法是一种压缩估计。它通过构造一个惩罚函数得到一个较为精炼的模型,使得它压缩一些回归系数,即强制系数...

    UEditor JSP 版本配置以及文件上传配置方法

    例如,可能会出现 "At least one JAR was scanned for TLDs" 的错误信息。这是因为页面中含有注释 `&lt;!-- --&gt;` 导致的,可以将其删除以解决问题。 配置 UEditor JSP 版本并实现文件上传功能需要按照以上步骤进行,...

Global site tag (gtag.js) - Google Analytics