前言
我们项目中的API接口都是有访问上限的,当访问频率或者并发量超过其承受范围时,我们就必须考虑限流来保证接口的可用性。防止非预期的请求对系统压力过大而引起的系统瘫痪。本篇文章会介绍限流算法中比较常见的漏桶算法和令牌桶算法。
漏桶算法
漏桶算法比较简单:首先有一个固定容量的漏桶,然后请求会先进入漏桶,漏桶会以一定的速率放出请求。如果请求进入漏桶的速率过大则会溢出,溢出部分请求会被丢弃。
示意图如下:
ps:图片来源于网络,侵删。
令牌桶算法
令牌桶算法:首先有一个存放了固定数量的令牌的桶,然后请求过来,会先从令牌桶中获取令牌,拿到令牌的请求会被处理。系统需要以一个恒定的速率向令牌桶中添加令牌,如果桶满时,新添加的令牌会被丢弃或拒绝;如果令牌桶中没有令牌,则拒绝服务或者阻塞。添加令牌的速率:
示意图如下:
ps:图片来源于网络,侵删。
漏桶算法和令牌桶算法对比
令牌桶算法限制的是平均流入速率,允许某种程度的突发传输,即只要有足够的令牌,支持一次拿2个令牌,3个令牌或者更多;而漏桶算法限制的是常量流出速率 ,即漏桶放出请求的速率是一个固定的常量值,不能这次是1,下次是2。
总结
这篇文章主要是介绍了漏桶算法和令牌桶算法的原理,在项目中我们可以根据业务场景选择合适的限流算法。
欢迎关注博主其他的文章。