前言
对于高并发的系统,有三把利器用来保护系统:缓存、降级 和 限流。限流常见的应用场景是秒杀、下单和评论等 突发性 并发问题。
- 缓存 的目的是提升 系统访问速度 和 系统吞吐量。
- 降级 是当服务 出问题 或者影响到核心流程的性能,则需要 暂时屏蔽掉,待 高峰 或者 问题解决后 再打开。
- 有些场景并不能用 缓存 和 降级 来解决,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)、频繁的复杂查询(最新的评论)。因此需有一种手段来限制这些场景的 并发/请求量,即 限流。
正文
限流的目的
限流的目的是通过对 并发访问/请求进行 限速,或者一个 时间窗口 内的的请求进行限速来 保护系统,一旦达到限制速率则可以 拒绝服务(定向到错误页或告知资源没有了)、排队 或 等待(比如秒杀、评论、下单)、降级(返回托底数据或默认数据,如商品详情页库存默认有货)。
限流的方式
- 限制 总并发数(比如 数据库连接池、线程池)
- 限制 瞬时并发数(如 nginx 的 limit_conn 模块,用来限制 瞬时并发连接数)
- 限制 时间窗口内的平均速率(如 Guava 的 RateLimiter、nginx 的 limit_req 模块,限制每秒的平均速率)
- 限制 远程接口 调用速率
- 限制 MQ 的消费速率
- 可以根据 网络连接数、网络流量、CPU 或 内存负