限流的策略:
1. 拒绝服务
2. 服务降级一一停掉不重要的服务,或只返回部分数据
3. 特权请求
4. 延时处理一一缓冲队列
5. 弹性伸缩
实现方式:
1. 计数器
2. 队列算法(带权队列)一一不能做push方式,建议用pull
3. 漏斗算法(TCP)
4. 令牌桶算法
漏斗算法会以一个稳定的速度转发,而令牌桶算法平时流量不大时在“攒钱”,流量大时,可以一次发出队列里有的请求,而后就受到令牌桶的流控限制。
基于响应时间的动态限流:能够动态地感知系统的压力来自动化地限流。可以参考设计典范, TCP 协议的拥塞控制的算法。
限流设计目的:
1. 为了向用户承诺 SLA。我们保证我们的系统在某个速度下的响应时间以及可用性。
2. 可以用来阻止在多租户的情况下,某一用户把资源耗尽而让所有的用户都无法访问的问题。
3. 为了应对突发的流量。
4. 节约成本。
限流设计要点:
1. 限流应该是在架构的早期考虑。当架构形成后,限流不是很容易加入。
2. 限流模块性能必须好,而且对流量的变化也是非常灵敏的,否则太过迟钝的限流,系统早因为过载而挂掉了。
3. 限流应该有个手动的开关,这样在应急的时候,可以手动操作。
4. 当限流发生时,应该有个监控事件通知。
5. 当限流发生时,对于拒掉的请求,我们应该返回一个特定的限流错误码。
6. 限流应该让后端的服务感知到。