Rate-limiting
常用限流措施:
- 网关层限流
- MQ流量削峰
- 单机协程池限流
网关层一般先通过 rate 包做一层简单的单机防护,再通过 Redis + Lua 做令牌桶限流 (允许一定程度的突发流量),全局精准控制QPS上限。
MQ流量削峰:
- 平时(同步): 网关 -> 订单服务 -> 数据库(DB 压力大,容易崩)。
- 大促(异步): 网关 -> 订单服务 -> MQ -> 下游服务 -> 数据库。
单机限流,避免瞬发流量(网关限流阈值内)引发单机的OOM。
令牌桶算法理解
- 系统以恒定速率向桶中放入令牌。如果请求(request)需要处理,必须先从桶中获取一个令牌。当桶中没有令牌时,拒绝请求(request)。
- 令牌桶算法允许突发流量在阈值范围内激增
漏桶算法理解
- 所有的请求(request)缓冲至桶内,系统以恒定的速率处理请求(request),当请求(request)的量累积至溢出桶外,拒绝请求(request)。
需要更平滑的流量控制,令牌桶算法可能更适合;如果你需要严格的速率控制,漏桶算法可能更合适。