Reference: https://time.geekbang.org/column/article/112160
背景
生产环境中可以用生产者消费者模式来实现瞬时高并发的流量削峰,然而这样做虽然缓解了消费方的压力,但生产方则会因为瞬时高并发,而发生大量线程阻塞。面对这样的情况,有什么方式可以优化线程阻塞所带来的性能问题吗?
无论我们的程序优化得有多么出色,只要并发上来,依然会出现瓶颈。虽然生产者消费者模式可以帮我们实现流量削峰,但是当并发量上来之后,依然有可能导致生产方大量线程阻塞等待,引起上下文切换,增加系统性能开销。这时,可以考虑在接入层做限流。
限流的实现方式有很多,例如,使用线程池、使用Guava的RateLimiter等。
但归根结底,它们都是基于这两种限流算法来实现的:漏桶算法和令牌桶算法。
漏桶算法
漏桶算法是基于一个漏桶来实现的,我们的请求如果要进入到业务层,必须经过漏桶,漏桶出口的请求速率是均衡的,当入口的请求量比较大的时候,如果漏桶已经满了,请求将会溢出(被拒绝),这样我们就可以保证从漏桶出来的请求量永远是均衡的,不会因为入口的请求量突然增大,致使进入业务层的并发量过大而导致系统崩溃。
令牌桶算法
令牌桶算法是指系统会以一个恒定的速度在一个桶中放入令牌,一个请求如果要进来,它需要拿到一个令牌才能进入到业务层,当桶里没有令牌可以取时,则请求会被拒绝。Google的Guava包中的RateLimiter就是基于令牌桶算法实现的。
总结
漏桶算法可以通过限制容量池大小来控制流量,而令牌算法则可以通过限制发放令牌的速率来控制流量。
相关推荐
限流算法是软件系统中用于保护服务稳定性和可用性的重要技术手段。在高并发场景下,如果系统处理请求的能力达到极限,过多的请求会导致服务崩溃。限流算法就是通过限制系统的处理速率,防止过载,确保系统能稳定、...
在这个“redis限流算法.zip”压缩包中,我们能看到几个关键的限流算法实现,包括计数法、令牌桶算法,以及基于Redis的漏斗算法的思路。这些算法在高并发场景下尤其重要,能够防止系统过载,保持服务的稳定性和可靠性...
本文重点讨论了三种限流算法:令牌桶算法、漏桶算法和计数器算法,并深入解析了Google Guava库中的RateLimiter类,它是基于令牌桶算法的实现。 1. **令牌桶算法**: - 令牌桶算法的核心思想是系统以恒定速率向桶中...
常见的限流算法有多种,如漏桶算法、令牌桶算法、滑动窗口算法等。在Java中,我们可以使用令牌桶算法来实现限流机制。 基于令牌桶算法的Java限流实现是指使用令牌桶算法来控制系统的流量,使得系统的流量不超过设定...
与市面上开源的限流工具(如谷歌的RateLimiter令牌桶限流、京东HotKey的滑动窗口限流,更关注流量突发缓解,但是过去流量占用资源是否释放不被关注)不同点在于使用加权计数器限流算法,关注流量的处理结果 ...
在分布式系统中,限流算法的实现往往更为复杂,需要考虑分布式环境下的数据一致性、网络延迟等问题。常见的分布式限流工具,如Hystrix和Sentinel,提供了丰富的限流策略和规则配置。 总的来说,选择合适的限流算法...
经典限流算法-窗口算法、漏桶算法、令牌桶算法
滑动窗口 滑动窗口协议是用来改善吞吐量的一种技术,即容许发送方在接收任何应答之前传送附加的包。接收方告诉发送方在某一时刻能送多少包(称窗口尺寸)。 TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着...
常见的限流算法有固定时间窗口限流算法、滑动时间窗口限流算法、令牌桶限流算法、漏桶限流算法等。其中,固定时间窗口限流算法最简单。我们只需要选定一个起始时间起点,之后每来一个接口请求,我们都给计数器加一,...
限流的常见实现算法有计数器固定窗口、计数器滑动窗口、漏桶算法和令牌桶算法。 1. 计数器固定窗口算法 计数器固定窗口算法的基本思想是在固定的时间窗口内,统计请求的数量。如果在该时间窗口内的请求次数超过了...
本文所讨论的《基于并行免疫粒子群算法的限流措施优化》研究正是在这样的背景下提出的。论文中,研究者们将免疫粒子群算法进一步优化升级,提出了并行免疫粒子群算法(Parallel Immune Particle Swarm Optimization,...
常见的限流算法有Token Bucket和滑动窗口算法。 1. Token Bucket算法:这个算法通过一个容量有限的令牌桶来限制流量。每当有请求到来,需要从桶里取出一个令牌,如果没有令牌则拒绝服务。令牌按固定速率放入桶中,...
通常有以下两种限流方案:漏桶算法令牌桶算法漏桶算法漏桶算法非常简单,就是将流量放入桶中并按照一定的速率流出。令牌桶算法令牌桶算法是按照恒定的速率向桶中放入令牌,
那么我们可以这么做:在一开始的时候,我们可以设置一个计数器counter,每当一个请求过来的时候,counter就加1,如果counter的值大于100并且该请
常见的限流算法有两种:令牌桶算法和漏桶算法。 1. **令牌桶算法**:令牌桶算法允许突发流量,但同时设置了最大速率。系统会按照一定的速率往桶里添加令牌,只有当桶中有令牌时,请求才能被处理。令牌的数量决定了...
1. 概述 2. 计数器 3. 漏桶算法 4. 令牌桶算法 5. 漏桶算法与令牌桶算法区别
Hystrix是Netflix开源的一款容错框架,包含常用的容错方法:线程隔离、信号量隔离、降级策略、熔断技术。 在高并发访问下,系统所依赖的服务的稳定性对系统的影响非常大,依赖有很多不可控的因素,比如网络连接变慢...
下面我们将详细探讨限流的原理、常见的限流算法以及如何编写限流代码。 限流的主要目标是在系统资源有限的情况下,确保服务的质量和响应时间。它可以防止恶意用户或异常流量对系统造成冲击,同时保证正常用户的体验...