微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Dubbo&Zookeeper面试题

1. dubbo中zk做注册中心,如果注册中心集群都挂掉了,发布者和订阅者直接还能通信吗?

可以通信,启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等信息,缓存在本地,每次调用时,按照本地存储的地址进行调用

注册中心对集群,任意一台宕机后,将会切换到另一台;注册中心全部宕机后,服务的提供者和消费者仍能通过本地缓存通讯。服务提供者无状态,任意宕机后,不影响使用;服务提供者全部宕机,服务消费者会服务使用,并无限次重连等待服务者恢复;

挂掉是不要紧的,但前提是没有增加新的服务,如果要调用新的服务,则是无法通信的;

2.dubbo有哪些负载均衡策略?

https://www.cnblogs.com/wyq178/p/9822731.html
什么是负载均衡策略
我们的程序是分布式应用,服务部署在多个节点(服务器)上,当消费者调用服务时,zk返回给dubbo的是一个节点列表,但是dubbo只会选择一台服务器,那么它究竟选择哪一台呢?这就是dubbo的负载均衡策略。

负载均衡介绍
改善了跨多个计算资源(如计算机、计算机集群、网络连接,中央处理单元或磁盘驱动的工作负载分布)负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间,并避免任何单个资源的过载。即:避免单个服务器响应同一请求,容易造成服务器宕机、崩溃等问题;

  • Random LoadBalance
    随机
    按权重设置随机概率。在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。(权重可以在dubbo管控台配置)

随机调用负载均衡,该类实现了抽象的AbstractLoadBalance接口,重写了doSelect方法,看方法的细节就是首先遍历每个提供服务的机器,获取每个服务的权重,然后累加权重,判断每个服务的提供者权重是否相同,如果每个调用者的权重不相同,并且每个权重大于0,那么就会根据权重的总值生成一个随机数,再用这个随机数,根据调用者的数据每次减去调用者的权重,直到计算出当前服务提供者随机数小于0,就选择那个提供者。另外,如果每个机器的权重相同,那么权重就不会参与计算,直接选择随机算法生成的某一个选择,完全随机

  • RoundRobin LoadBalance
    轮循:
    按公约后的权重设置轮循比率。存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

轮询调用,轮询调用的过程主要是维护了局部变量的一个linkdesHashMap(有顺序的Map)去存储调用者和权重值得对应关系,然后遍历每个调用者,把调用者和当前大于0的权重值放进去,再累加权重值。还有个全局变量的map,找到第一个服务调用者,首先是找到每个服务的key值和method,这里可以理解为标识第一个调用者的唯一key,然后再给它对应的值保证原子性+1(AtomicPostitiveInteger是原子的),再对这个值取模总权重,再每次对其权重值-1,知道它取模与总权重的值等于0就选择该调用者,可以称之为“降权取模”*(只是一种的计算层面,而不是真正降权)。总结:轮询调用并不是简单的一个接着一个一次调用,它是根据权重的值进行循环的;

  • LeastActive LoadBalance
    最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。使慢的提供者收到更少的请求,因为越慢的提供者的调用前后计数差会越大。

最少活跃数调用法:这个方法的主要作用根据服务的提供者的运行状态去选择服务器,主要的思路就是遍历每个调用者,然后获取每个服务器的运行状态,如果当前运行的运行状态小于最小的状态-1,把它保存在leastIndexs中的第一个位置,并且认定所有的调用者权重都相同,然后直接返回那个调用者(这里的逻辑是:找到最少活跃数(在代码层反应就是:active的值))。如果计算出的权重值和最少的权重值相同,那么把它保存在leastIndexs数组里面,累加权重值,如果当前的权重值不等于初始值firstWeight,那么就认定不是所有的调用者的权重不同。然后再遍历lestIndexs,取权重累加值的随机生成权重偏移量,在累减它,到它小于0的时候返回那个调用者。如果这些都不符合,就从leastIndexs随机一个index,返回那个调用者!

  • ConsistentHash LoadBalance
    一致性Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂掉时,原本该发往该提供者的请求,基于虚拟节点,平摊到其他提供者,不会引起剧烈变动

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐