如何限流?在工作中是怎么做的?说一下具体的实现?
计数器:控制单位时间内的请求数量。缺陷:设每分钟请求数量为60个,每秒可以处理1个请求,用户在 00:59 发送 60 个请求,在 01:00 发送 60 个请求 此时2秒钟有120个请求(每秒60个请求),远远大于了每秒钟处理数量的阈值。
滑动窗口:滑动窗口是对计数器方式的改进, 增加一个时间粒度的度量单位。把一分钟分成若干等分(6份,每份10秒), 在每一份上设置独立计数器,在 00:00-00:09 之间发生请求计数器累加1.当等分数量越大限流统计就越详细。
Leaky Bucket漏桶:规定固定容量的桶, 有水进入, 有水流出. 对于流进的水我们无法估计进来的数量、速度, 对于流出的水我们可以控制速度.
Token Bucket令牌桶:规定固定容量的桶, token 以固定速度往桶内填充, 当桶满时 token 不会被继续放入, 每过来一个请求把 token 从桶中移除, 如果桶中没有 token 不能请求。
sentinel和spring cloud gateway两个框架都是很好的限流框架。
spring cloud gateway 默认使用redis进行限流, 修改参数拿来即用。
sentinel:通过配置来控制每个url的流量。