【算法设计】限流算法
目录
2.2 每台机器单独限流 totalth/machineCount
1.现有算法
计数器 | 桶 | |||
---|---|---|---|---|
|
计数器 |
滑动窗口 |
漏桶 |
令牌桶 |
实现 | 需要一个计数器 | 需要多个计数器 | 需要一个桶 | 需要一个桶 |
优点 | 实现简单 | 允许短时的爆发流量 |
允许短时的爆发流量, 处理速度恒定 |
允许短时的爆发流量, 适合处理速度不固定的应用 |
缺点 |
无缓冲, 不允许短时的爆发流量 |
请求处理时间突然拉长后, 处理中的请求会超限 |
不精确 桶满了就拒绝, 即使新的周期内流量并未超限 |
不精确 桶空了就拒绝, 即使新的周期内流量并未超限 |
比较常用的桶类别,比如我们的系统选择漏桶实现,redis的某个key
漏桶 | 令牌桶 |
1.2 维度设计
限流的维度的选择大概有以下2种:
key分散 |
用户、ip等离散值比较多的维度 key多,占用内存大 |
---|---|
key聚集 |
针对产品线、商户等比较集中的维度 热点key问题 |
2.分布式
2.1 redis共享存储
2.1.1 缺点:
- 热点key:一个key的流量非常大,会导致对同个key的频繁原子读写,势必成为瓶颈。
- 依赖redis可用性:对存储数据的服务要求比较高,分key后存储并不是瓶颈,cpu是瓶颈,需要根据限流阈值预先分配存储机器,每加一个限流业务,就得扩容
2.1.2 优化方案:
sharding思想:将1个key的读写,随机分散到多个key上,只要保证分散的足够均匀,就不会出现提前触发限流的情况发生。
2.2 每台机器单独限流 totalth/machineCount
2.2.1 缺点:
问题 | 描述 |
易触发 |
每台机器的阈值低,容易提前触发限流 流量分布不均衡,会导致部分机房提前触发限流 |
维护困难 | 扩容/缩容/故障/下线等机器数发生变化,及时修改 |
2.2.2 优化方案:
- 小阈值情况从服务注册处感知节点变化实时计算限流
- 从入口处(nginx等)保障流量均衡