《Apache Dubbo微服务开发从入门到精通》——服务发现与负载均衡——三、 负载均衡机制(3) https://developer.aliyun.com/article/1224432
7) 自适应限流
与负载均衡运行在consumer端不同的是,限流功能运行在provider端。其作用是限制provider端处理并发任务时的最大数量。从理论上讲,服务端机器的处理能力是存在上限的,对于一台服务端机器,当短时间内出现大量的请求调用时,会导致处理不及时的请求积压,使机器过载。在这种情况下可能导致两个问题:
• 由于请求积压,最终所有的请求都必须等待较长时间才能被处理,从而使整个服务瘫痪。
• 服务端机器长时间的过载可能有宕机的风险。因此,在可能存在过载风险时,拒绝掉一部分请求反而是更好的选择。在之前的dubbo版本中,限流是通过在provider端设置静态的最大并发值实现的。但是在服务数量多,拓扑复杂且处理能力会动态变化的局面下,该值难以通过计算静态设置。
基于以上原因,我们需要一种自适应的算法,其可以动态调整服务端机器的最大并发值,使其可以在保证机器不过载的前提下,尽可能多的处理接收到的请求。因此,我们参考brpc等其他框架的基础上,在dubbo的框架内实现了两种自适应限流算法,分别是基于启发式平滑的“HeuristicSmoothingFlowControl”和基于窗口的“AutoConcurrencyLimier”。
8) 效果介绍
自适应限流部分的有效性实验我们在提供端机器配置尽可能大的情况下进行,并且为了凸显效果,在实验中我们将单次请求的复杂度提高,将超时时间尽可能设置的大,并且开启消费端的重试功能。
9) 使用方法
要确保服务端存在多个节点,并且消费端开启重试策略的前提下,限流功能才能更好的发挥作用。
设置方法与静态的最大并发值设置类似,只需在provider端将“flowcontrol”设置为“autoConcurrencyLimier”或者“heuristicSmoothingFlowControl”即可。
10) 代码结构
• FlowControlFilter:在provider端的filter负责根据限流算法的结果来对provider端进行限流功能。
• FlowControl:根据dubbo的spi实现的限流算法的接口。限流的具体实现算法需要继承自该接口并可以通过dubbo的spi方式使用。
• CpuUsage:周期性获取cpu的相关指标。
• HardwareMetricsCollector:获取硬件指标的相关方法。
• ServerMetricsCollector:基于滑动窗口的获取限流需要的指标的相关方法。比如qps等。
• AutoConcurrencyLimier:自适应限流的具体实现算法。
• HeuristicSmoothingFlowControl:自适应限流的具体实现方法。
《Apache Dubbo微服务开发从入门到精通》——服务发现与负载均衡——三、 负载均衡机制(5) https://developer.aliyun.com/article/1224429
