1.4 限流算法
时间:2022-03-05 00:50:01 | 来源:行业动态
时间:2022-03-05 00:50:01 来源:行业动态
在上面的功能概览中简单的说明了在某些场景中我们需要进行流量限制,那么这里将详细介绍限流的原理。
在OSS中,我们使用Guava的RateLimiter作为限流的组件。Guava的RateLimiter的限流方式有两种:漏桶算法和令牌桶算法。我们采用的是令牌桶算法。
对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。如图所示,令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。
我们的OSS就是采用令牌桶的方式来对流量进行限制的,当客户端以某一稳定的速率来向OSS写入的时候,系统是稳定的并且大多数的时候是这样的。但是我们有时需要应对流量峰值,这个时候超过我们规定的流量就会被限制。现在问题来了,被限制的流量如果直接丢弃,那么可能重要的文件被丢弃,这样显然不符合我们对OSS定位为高可用存储系统的要求。于是在限流的逻辑中我们加入了以下处理流程:当流量达到系统的瓶颈时,我们将被限流的流量写入kafka,等到系统负载降低的时候,再从kafka中读取这部分流量重放至OSS,这样既保证了OSS的稳定性,又解决因限流带来的数据丢失问题。