码迷,mamicode.com
首页 > 编程语言 > 详细

限流算法

时间:2019-09-08 09:51:18      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:blank   上下   切换   导致   ref   令牌   生产者消费者模式   guava   消费   

Reference: https://time.geekbang.org/column/article/112160

 

背景

生产环境中可以用生产者消费者模式来实现瞬时高并发的流量削峰,然而这样做虽然缓解了消费方的压力,但生产方则会因为瞬时高并发,而发生大量线程阻塞。面对这样的情况,有什么方式可以优化线程阻塞所带来的性能问题吗?

 

无论我们的程序优化得有多么出色,只要并发上来,依然会出现瓶颈。虽然生产者消费者模式可以帮我们实现流量削峰,但是当并发量上来之后,依然有可能导致生产方大量线程阻塞等待,引起上下文切换,增加系统性能开销。这时,可以考虑在接入层做限流。

 

限流的实现方式有很多,例如,使用线程池、使用Guava的RateLimiter等。

但归根结底,它们都是基于这两种限流算法来实现的:漏桶算法和令牌桶算法。

 

漏桶算法

漏桶算法是基于一个漏桶来实现的,我们的请求如果要进入到业务层,必须经过漏桶,漏桶出口的请求速率是均衡的,当入口的请求量比较大的时候,如果漏桶已经满了,请求将会溢出(被拒绝),这样我们就可以保证从漏桶出来的请求量永远是均衡的,不会因为入口的请求量突然增大,致使进入业务层的并发量过大而导致系统崩溃。

 

令牌桶算法

令牌桶算法是指系统会以一个恒定的速度在一个桶中放入令牌,一个请求如果要进来,它需要拿到一个令牌才能进入到业务层,当桶里没有令牌可以取时,则请求会被拒绝。Google的Guava包中的RateLimiter就是基于令牌桶算法实现的。

 

总结

漏桶算法可以通过限制容量池大小来控制流量,而令牌算法则可以通过限制发放令牌的速率来控制流量。

 

限流算法

标签:blank   上下   切换   导致   ref   令牌   生产者消费者模式   guava   消费   

原文地址:https://www.cnblogs.com/agilestyle/p/11484112.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!