首页 › AI System Design › 第4章:设计速率限制器

第4章:设计速率限制器

简介​

本章将探讨限流器的设计与实现——这是一种用于控制客户端或服务发送的流量速率的系统组件。限流器对于防范滥用、降低成本以及保障服务器资源的稳定性至关重要。其使用场景包括限制发帖、账户创建以及奖励领取。​

限流的优势​

•

防止拒绝服务攻击:拦截过多的请求,避免资源耗尽。​

•

成本降低:通过限制不必要的请求来降低服务器成本。​

•

防止过载:过滤掉过多的请求,以稳定服务器性能。​

步骤1:理解问题​

Key Features​

服务端 API 速率限制器、支持多种限流规则、在分布式环境中处理大规模系统、适用于独立服务或应用级代码的方案、限流时向用户提示。​

步骤2:概要设计​

Placement Options​

​

飞书文档 - 图片

​

客户端实现:由于可能存在误用,可靠性较差。​

服务器端实现:更受青睐,因其可控性和可靠性。​

中间件(API网关):一种灵活的集成式限流方案。​

Guidelines for Placement​

•

评估现有技术栈,选择高效方案。​

•

根据业务需求选择合适的算法。​

•

采用微服务架构时,应使用API网关。​

•

若资源有限,可选择商业解决方案。​

步骤3:限流算法​

Token Bucket​

​

飞书文档 - 图片

​

•

描述:令牌以固定速率添加到桶中;每次请求消耗一个令牌。​

•

参数:桶的大小和补充速率。​

•

优点:实现简单、内存效率高,支持流量突发。​

•

缺点:需要精心调参。​

Leaking Bucket​

​

飞书文档 - 图片

​

•

描述:通过FIFO队列以固定速率处理请求。​

•

优点:内存效率高,输出速率稳定。​

•

缺点:流量突发可能导致近期请求延迟。​

•

示例:https://github.com/uber-go/ratelimit​

Fixed Window Counter​

​

​

•

描述:将时间划分为固定的时间间隔,并使用计数器来限制请求数量。​

•

优点:简单,对特定使用场景高效。​

•

缺点:在时间窗口边缘出现流量高峰时可能超出限制。​

•

在时间窗口的边缘突然出现大量流量时,可能导致通过的请求数量超过允许的配额。​

​

​

Sliding Window Log​

​

​

•

描述:通过记录时间戳实现滚动时间窗口。​

•

优点:限流精准。​

•

缺点:内存消耗较高。​

Sliding Window Counter​

​

​

•

描述:结合固定窗口法与滑动日志法,用于平滑突发流量。​

•

优点:内存效率高,能够应对流量突发。​

•

缺点:近似结果可能不够严格。​

高层次架构​

​

​

•

数据存储:使用内存缓存(如 Redis)以实现快速的计数操作。​

•

步骤:​

高级考量​

Distributed Environments​

•

挑战:竞态条件、同步问题。​

•

解决方案:使用锁、Lua 脚本或 Redis 中的有序集合。采用集中式数据存储进行同步。​

Performance Optimizations​

•

通过多数据中心部署降低延迟。​

•

采用最终一致性模型实现同步。​

Monitoring​

•

定期开展分析,确保算法的有效性,并根据需要调整规则​