zoukankan      html  css  js  c++  java
  • 4.Dubbo2.5.3集群容错和负载均衡

    转载请出自出处:http://www.cnblogs.com/hd3013779515/

    1.集群容错和负载均衡原理

    各节点关系:

    • 这里的Invoker是Provider的一个可调用Service的抽象,Invoker封装了Provider地址及Service接口信息。
    • Directory代表多个Invoker,可以把它看成List<Invoker>,但与List不同的是,它的值可能是动态变化的,比如注册中心推送变更。
    • Cluster将Directory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。
    • Router负责从多个Invoker中按路由规则选出子集,比如读写分离,应用隔离等。
    • LoadBalance负责从多个Invoker中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选。

    2.负载均衡

    (1)配置说明


    在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用。

    Random LoadBalance
    • 随机,按权重设置随机概率。
    • 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
    RoundRobin LoadBalance
    • 轮循,按公约后的权重设置轮循比率。
    • 存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
    LeastActive LoadBalance
    • 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
    • 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
    ConsistentHash LoadBalance
    • 一致性Hash,相同参数的请求总是发到同一提供者。
    • 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
    • 算法参见:http://en.wikipedia.org/wiki/Consistent_hashing
    • 缺省只对第一个参数Hash,如果要修改,请配置<dubbo:parameter key="hash.arguments" value="0,1" />
    • 缺省用160份虚拟节点,如果要修改,请配置<dubbo:parameter key="hash.nodes" value="320" />

    配置如:

    <dubbo:service interface="..." loadbalance="roundrobin" />

    或:

    <dubbo:reference interface="..." loadbalance="roundrobin" />

    或:

    <dubbo:service interface="...">
         <dubbo:method name="..." loadbalance="roundrobin"/>
    </dubbo:service>

    或:

    <dubbo:reference interface="...">
          <dubbo:method name="..." loadbalance="roundrobin"/>
    </dubbo:reference>

    (2)使用案例

    3.Dubbo2.5.3快速启动Hello World的基础上增加服务提供者,与dubbo-hello-provider的区别如下。

    image

    image

    服务消费者HelloServiceConsumerTest.java中加上循环调用服务提供者。

    package cn.ljh.dubbo.service;
    
    import java.io.IOException;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class HelloServiceConsumerTest {
        public static void main(String[] args) {  
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(  
                    new String[] { "applicationConsumer.xml" });  
              
            context.start();  
            for(int i = 0 ; i < 100 ; i++){
                HelloService providerService = (HelloService) context.getBean("helloService");  
                System.out.println(providerService.sayHello("Tom"));  
            }
            
            try {  
                System.in.read();//让此程序一直跑
            } catch (IOException e) {         
                e.printStackTrace();  
            }    
        }  
    }

    1)缺省Random LoadBalance的时候

    开始时,HelloService的两个提供者的权重都是100,服务消费者执行后的分配比例为54:46。

    然后通过监控中心把20880这个提供者的权重加到400,这时服务消费者执行后的分配比例为83:17。

    image

    2)设置为RoundRobin LoadBalance的时候

    image

    HelloService的两个提供者的权重都是100时,严格安装轮循方式。

    image

    把20880这个提供者的权重加到400时,按照权重来轮循。

    image

    3.集群容错

    (1)配置说明

    集群容错模式:
    Failover Cluster
    • 失败自动切换,当出现失败,重试其它服务器。(缺省)
    • 通常用于读操作,但重试会带来更长延迟。
    • 可通过retries="2"来设置重试次数(不含第一次)。
    Failfast Cluster
    • 快速失败,只发起一次调用,失败立即报错。
    • 通常用于非幂等性的写操作,比如新增记录。
    Failsafe Cluster
    • 失败安全,出现异常时,直接忽略。
    • 通常用于写入审计日志等操作。
    Failback Cluster
    • 失败自动恢复,后台记录失败请求,定时重发。
    • 通常用于消息通知操作。
    Forking Cluster
    • 并行调用多个服务器,只要一个成功即返回。
    • 通常用于实时性要求较高的读操作,但需要浪费更多服务资源。
    • 可通过forks="2"来设置最大并行数。
    Broadcast Cluster
    • 广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持)
    • 通常用于通知所有提供者更新缓存或日志等本地资源信息。

    重试次数配置如:(failover集群模式生效)

    <dubbo:service retries="2" />

    或:

    <dubbo:reference retries="2" />

    或:

    <dubbo:reference>
    
        <dubbo:method name="findFoo" retries="2" />
    
    </dubbo:reference>

    集群模式配置如:

    <dubbo:service cluster="failsafe" />

    或:

    <dubbo:reference cluster="failsafe" />

    (2)使用案例

    代码改造

    两个服务提供者同时改造

    HelloServiceImpl.java

    增加sleep时间以方便在服务消费者调用时能停掉服务提供者。

    image

    applicationProvider.xml

    image

    1)缺省Failover Cluster的时候

    在服务消费者执行过程中,通过监控中心禁用某个服务提供者,执行结果显示能够正确切换到可用服务提供者,不会报错或者丢失调用。

    2)设置为Failfast Cluster的时候

    当服务消费者调用某个服务提供者时,如果停掉该服务提供者,将立即报错并不继续执行。

    image

    3)设置为Failsafe Cluster的时候

    当服务消费者调用某个服务提供者时,如果停掉该服务提供者,直接忽略,继续往下走。

    image

    参考

    http://dubbo.io/User+Guide-zh.htm

  • 相关阅读:
    Powershell数据处理
    Powershell About Active Directory Group Membership of a domain user
    Powershell About Active Directory Server
    Oracle Schema Objects——Tables——TableStorage
    Oracle Schema Objects——Tables——TableType
    English Grammar
    Oracle Database Documentation
    Oracle Schema Objects——Tables——Oracle Data Types
    Oracle Schema Objects——Tables——Overview of Tables
    What is Grammar?
  • 原文地址:https://www.cnblogs.com/hd3013779515/p/6896942.html
Copyright © 2011-2022 走看看