令牌桶与漏桶,流量控制哪家强?
摘要:大家好,我是小富~ 面试被问到限流算法,很多面试官会让直接手写令牌桶和漏桶的实现。虽然平时用过Redis、Guava等现成的限流工具,但真要手写还是有点慌。今天就来聊聊这两种经典限流算法的区别,并用Java手写实现。 很多的限流工具底层都应
大家好,我是小富~
面试被问到限流算法,很多面试官会让直接手写令牌桶和漏桶的实现。虽然平时用过Redis、Guava等现成的限流工具,但真要手写还是有点慌。今天就来聊聊这两种经典限流算法的区别,并用Java手写实现。
很多的限流工具底层都应用了它们
一、令牌桶 vs 漏桶:核心区别
令牌桶
令牌桶的核心思想:固定容量的桶,以固定速率往桶里放令牌,请求来了就从桶拿令牌,没令牌就拒绝。
有点像买票进站,想去坐火车就先去售票窗口买票,买到票了就凭票进入,买不到等待,因为窗口会定时的放票,再去抢。
下图是用Ai生成的,大致能体现出这么个意思
令牌桶特点:
1、可以处理突发流量(桶里有令牌就能用),因为并不是一直请求都很多,但会一直以固定速率向桶里添加令牌,请求少时桶内令牌满了,请求激增可以满桶拿令牌顶一阵
2、原理和实现上相对简单
3、内存占用小
漏桶适用场景:
接口限流:保护业务系统或者敏感接口
防止恶意攻击:抵御Dos或DDos攻击
……
它的优势在于能够限制平均速率,同时允许一定的突发流量
漏桶
漏桶的核心思想比令牌桶早更简单:请求像水一样流入桶中,桶以固定速率“漏水”处理请求,超出桶容量的请求被丢弃或排队。
