《Apache Dubbo微服务开发从入门到精通》——服务发现与负载均衡——三、 负载均衡机制(1) https://developer.aliyun.com/article/1224435
2. 自适应负载均衡与服务柔性
1) 整体介绍
本文所说的“柔性服务”主要是指consumer端的负载均衡和provider端的限流两个功能。在之前的dubbo版本中,负载均衡部分更多的考虑的是公平性原则,即consumer端尽可能平等的从provider中作出选择,在某些情况下表现并不够理想。而限流部分只提供了静态的限流方案,需要用户对provider端设置静态的最大并发值,然而该值的合理选取对用户来讲并不容易。我们针对这些存在的问题进行了改进。
2) 负载均衡
在原本的dubbo版本中,有五种负载均衡的方案供选择,他们分别是“Random”,“ShortestResponse”,“RoundRobin”,“LeastActive”和“ConsistentHash”。其中除“ShortestResponse”和“LeastActive”外,其他的几种方案主要是考虑选择时的公平性和稳定性。
对于“ShortestResponse”来说,其设计目的是从所有备选的provider中选择response时间最短的以提高系统整体的吞吐量。然而存在两个问题:
• 在大多数的场景下,不同provider的response时长没有非常明显的区别,此时该算法会退化为随机选择。
• response的时间长短有时也并不能代表机器的吞吐能力。对于“LeastActive”来说,其认为应该将流量尽可能分配到当前并发处理任务较少的机器上。但是其同样存在和“ShortestResponse”类似的问题,即这并不能单独代表机器的吞吐能力。
基于以上分析,我们提出了两种新的负载均衡算法。一种是同样基于公平性考虑的单纯“P2C”算法,另一种是基于自适应的方法“adaptive”,其试图自适应的衡量provider端机器的吞吐能力,然后将流量尽可能分配到吞吐能力高的机器上,以提高系统整体的性能。
3) 效果介绍
对于负载均衡部分的有效性实验在两个不同的情况下进行的,分别是提供端机器配置比较均衡和提供端机器配置差距较大的情况。
4) 使用方法
使用方法与原本的负载均衡方法相同。只需要在consumer端将“loadbalance”设置为“p2c”或者“adaptive”即可。
5) 代码结构
负载均衡部分的算法实现只需要在原本负载均衡框架内继承LoadBalance接口即可。
《Apache Dubbo微服务开发从入门到精通》——服务发现与负载均衡——三、 负载均衡机制(3) https://developer.aliyun.com/article/1224432