为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第3天 服务治理的另一条路-Dubbo

标签:
架构

课程名称Java架构师-技术专家
课程章节阶段四 · 服务治理的另一条路 - Dubbo
课程讲师: 慕课讲师团队

课程内容

Dubbo 中的负载均衡

Dubbo 使用的是自己的负载均衡方案,但其实理论上还是客户端负载均衡,将访问请求用某种方式尽量“平均”的分发到服务节点上,避免部分服务器因负载过高而挂掉。

负载均衡策略

底层算法

RandomLoadBalance

基于权重算法的负载均衡策略

LeastActiveLoadBalance

基于最少活跃调用数算法

ConsistentHashLoadBalance

基于 Hash一致性

RoundRobinLoadBalance

基于加权轮询算法

RandomLoadBalance—权重算法

RandomLoadBalance 是 Dubbo 的缺省实现,所谓权重算法,实际上是加权随机算法的意思,它的算法思想如下:

RandomLoadBalance

假设我们有一组服务器分别是 A,B,C,他们对应的权重为 A = 5 ,B = 3 , C=2 ,权重总和为 10 。现在把这些权重值平铺在一维坐标值上,[0,)区间属于服务器 A , [5, 8)区间属于服务器 B,[8,10) 区间属于服务器 C。

接下来通过随机数生成器一个范围在 [0,10) 之间的随机数,然后计算这个随机数会落到那个区间上。比如数字 3 会落到服务器 A 对应的区间上,,此时返回服务器 A 即可。权重越大的机器,在坐标轴上对应的区间范围就越大,因此随机数生成器生成的数字就会有更大的概率落到此区间中。

只要随机数生成器产生的随机数分布性很好,在经过多次选择后,每个服务器被选中的次数比例接近其权重比例。比如,经过一万次选择后,服务器 A 被选中的次数大约是 5000 次,服务器 B 被选中的次数约为 3000 次,服务器 C 被选中的次数约为 2000 次。

LeastActiveLoadBalance- 最少活跃数

这个算法的思想就是“能者多劳”,它认为当前活跃调用数越小,表明该服务提供者效率越高,单位时间内可处理更多的请求,因此应优先将请求分配给该服务提供者。

该算法给每个服务提供者设置一个 “active“ 属性,初始值为 0 ,每收到一个请求,活跃数加 1 ,完成请求后则将活跃数减 1。在服务运行一段时间后,性能好的服务提供者处理请求的速度更快,因此活跃数下降的也越快,此时这样的服务提供者能够优先获取到新的服务请求、这就是最小活跃数负载均衡算法的基本思想。

当然这种算法也有不公平的地方,比如某台机器是扩容后新上线的机器,因此 active 的值是 0 ,而这时 Dubbo 会认为这台机器的速度快如闪电,但其实这台机器的性能有可能慢如老狗。

除了最小活跃数以外,LeastActiceLoadBalance 在实现上还实现了 权重值。所以准确的来说,LeastActiveLoadBalance 是基于加权最小活跃数算法实现的。

比如,在一个服务提供者集群中,有两个性能优异的服务提供者。某一时刻它们的活跃数相同,此时 Dubbo 会根据它们的权重去分配请求,权重越大,获取到新请求的概率就越大。如果两个服务提供者权重相同,此时随机选择一个即可。

ConsistentHashLoadBalance - Hash 算法

一致性 Hash 算法提出最初是用于大规模缓存系统的负载均衡。在Dubbo 中它的工作流程是这样的

  1. 首先根据服务地址为服务节点生成一个Hash,并将这个 Hash 投射到 [0,232-1]的圆环上

  2. 当有请求来了,根据请求参数等维度的信息作为一个 key,生成一个 hash 值。然后查找第一个大于或等于该 Hash 值的服务节点,并将这个请求转发到给节点。

  3. 如果当前节点挂了,则查找另一个大于其 Hash 值得缓存节点即可。

    ConsistentHashLoadBalance

如上图所示,4 台机器均匀分布在圆环中,所有请求会访问第一个大于或等于自身 Hash 的节点。Server 3 这台机器处于不可用的状态,因此所有请求继续向后寻找直到找到 Server 4.

RoundRobinLoadBalance - 加权轮询

它和 Ribbon 的 RoundRobinRule 差不多。

所谓轮询是将请求轮流分配给每台服务器。比如说我们有 3 台机器 A、B、C,当请求到来的时候我们从 A 开始依次派发,第一个请求给到 A,第二个给到 B, 依次类推,到最后一个节点 C 派发完成之后,在回到 A 重新开始。

从上面的例子可以看到,每台机器接到请求的概率是相等的,但是在实际应用中,我们并不能保证每台机器的效率都一样,因此可能会出现某台 Server 性能特别慢无法消化请求的情况。因此我们需要对轮询过程进行加权,以调控每台服务器的负载。

经过加权后,每台服务器能够得到的请求书比例,接近或等于它们的权重比。比如服务器 A、B 、C 权重比为 5:2:1。那么在 8 次请求中,服务器 A 将受到其中的 5 次请求,服务器 B 会收到其中的 2 次请求,服务器 C 则收到其中的 1 次请求。

配置负载均衡策略

Dubbo 可以在类级别 (@Service)和方法级 (@Resource)指定负载均衡策略,以方法级别为例,下面的代码配置了 RoundRobin 的负载均衡规律。

@Reference(loadbalance = "roundrobin")  
private IDubboService dubboService;

课程收获

今天学习了以下内容:

  1. dubbo admin的使用
  2. dubbo 的负载均衡
    图片描述
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
6
获赞与收藏
11

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消