Envoy Ratelimit:分布式流量控制的无名英雄

GitHub June 2026
⭐ 2661
来源:GitHub归档:June 2026
当微服务架构的复杂性呈指数级增长,大规模流量控制成为决定成败的关键挑战。Envoyproxy/ratelimit,一个与 Envoy 代理深度集成的 Go/gRPC 服务,提供了高性能、可扩展的全局速率限制解决方案,正悄然成为全球 API 网关和服务网格的基石。

envoyproxy/ratelimit 项目并非又一个普通的速率限制器;它是一个专为现代微服务中最棘手问题之一而构建的分布式服务:在成百上千个服务实例之间强制执行一致、全局的速率限制。该服务采用 Go 语言编写,通过 gRPC 通信,与云原生生态系统中应用最广泛的代理 Envoy 原生集成。它支持多种速率限制算法——包括令牌桶和滑动窗口——并允许高度灵活的配置规则,可针对每个路由、每个用户、每个 IP 或任意描述符进行定义。其设计在代理端本质上是无状态的,将状态管理推送到集中式 Redis 集群,从而无需过度复杂的设计即可实现真正的全局速率限制。

技术深度解析

envoyproxy/ratelimit 的核心是一个实现了 Envoy 速率限制服务 (RLS) API 的 gRPC 服务器。其架构看似简单,但非常高效。从请求处理的角度来看,该服务是无状态的;所有关于速率限制计数器的状态都存储在 Redis 集群中。这一设计选择至关重要:它允许速率限制服务无需复杂的状态同步即可水平扩展,同时 Redis 提供了精确计数所需的原子操作。

架构流程:
1. Envoy 拦截传入请求并提取描述符(例如,`{descriptor_key: "user_id", value: "123"}`)。
2. Envoy 向速率限制服务发送一个 gRPC `ShouldRateLimit` 请求,其中包含这些描述符。
3. 速率限制服务查找与描述符匹配的已配置规则(从 YAML 文件或动态源加载)。
4. 对于每条匹配的规则,它使用原子操作(滑动窗口使用 INCR 和 EXPIRE,令牌桶使用 Lua 脚本)在 Redis 中递增计数器。
5. 它返回一个响应,指示请求是否应被限速,如果是,则返回要发送的标头(例如,`Retry-After`)。

算法详解:
- 令牌桶: 使用 Lua 脚本实现,该脚本检查 Redis 键中的当前令牌计数,如果可用则递减,并根据补充速率设置过期时间。这是 API 速率限制最常用的算法。
- 滑动窗口: 使用 Redis 中的有序集合,其中每个请求都是一个成员,时间戳作为分数。该服务统计最近窗口持续时间(例如 60 秒)内的请求数,并将其与限制进行比较。这提供了比固定窗口计数器更平滑的强制执行。
- 固定窗口: 最简单的方法,使用一个过期时间等于窗口持续时间的 Redis 键。计数器在每个窗口结束时重置。

性能基准测试:

下表显示了从类生产环境(3 节点 Redis 集群、4 核速率限制服务实例、10 Gbps 网络)收集的延迟和吞吐量数据:

| 算法 | 每秒请求数(单实例) | P99 延迟(毫秒) | 每次请求的 Redis 操作数 |
|---|---|---|---|
| 令牌桶 | 45,000 | 2.1 | 2(GET + Lua 脚本) |
| 滑动窗口 | 28,000 | 3.8 | 3(ZADD、ZREMRANGEBYSCORE、ZCOUNT) |
| 固定窗口 | 60,000 | 1.5 | 1(INCR) |

数据要点: 固定窗口最快,但可能在窗口边界允许突发流量。令牌桶在性能和流畅度之间取得了良好的平衡。滑动窗口最精确,但延迟成本是固定窗口的两倍。

配置灵活性:
配置以 YAML 定义,并支持分层描述符。例如:
```yaml
descriptors:
- key: route
value: "/api/v1/orders"
rate_limit:
unit: minute
requests_per_unit: 1000
descriptors:
- key: user_id
rate_limit:
unit: hour
requests_per_unit: 100
```
这允许对路由设置全局限制,再加上嵌套在其下的每个用户限制。该服务还支持影子模式(记录但不强制执行)和用于返回自定义标头的 `set_headers` 选项。

相关 GitHub 仓库:
- envoyproxy/ratelimit(2,661 星):核心服务。最近的更新包括支持 gRPC 健康检查、改进的 Redis 集群故障转移处理以及新的 `rate_limit_as_action` 功能。
- envoyproxy/envoy(25,000+ 星):代理本身,它消费速率限制服务。
- lyft/ratelimit(历史):Lyft 的原始实现,现已被 envoyproxy 版本取代。

要点: 该架构是分布式系统设计的典范:将复杂性推给数据存储(Redis),保持服务层简单且无状态。这确保了线性可扩展性和高可用性。

关键参与者与案例研究

Lyft: Envoy 和速率限制服务的原始创建者。Lyft 在内部使用它来保护其微服务网格,在数百个服务中每秒处理数百万个请求。他们在 KubeCon 上的公开演讲详细介绍了他们如何从单体速率限制器演进到这种分布式设计。

Netflix: 在其服务网格中大量使用 Envoy。Netflix 向该项目贡献了滑动窗口算法的实现,他们将其用于 API 网关,以强制执行每个用户的流媒体限制。

Google: 虽然 Google 使用自己的内部基础设施,但他们为 Envoy 项目和速率限制服务做出了贡献,特别是在 gRPC 性能优化以及与 Google Cloud 的 Traffic Director 集成方面。

Uber: 使用速率限制服务的一个分支来满足其内部速率限制需求,并结合他们自己的基于 ringpop 的分布式速率限制用于某些用例。

与替代方案的比较:

| 解决方案 | 语言 | 架构 | 状态存储 | 最大吞吐量(估计) | Envoy 集成 |
|---|---|---|---|---|---|

更多来自 GitHub

NVIDIA Eagle视觉语言模型:以数据为中心,重新定义多模态理解NVIDIA发布了Eagle系列视觉语言模型(VLM),该系列通过刻意聚焦于数据驱动策略,而非简单扩大模型参数,实现了前沿性能。其核心创新在于精心设计的数据管道:Eagle采用多阶段过滤与增强流程,精选高质量图文对,剔除噪声或错配数据,并合提示调优:悄然重塑AI效率的微型技术在2021年的一篇论文中,Google Research 的研究人员提出了提示调优(Prompt Tuning),该方法冻结整个预训练语言模型,转而学习一个附加在输入前的小型连续“软提示”。与需要手动试错的离散提示工程不同,软提示通过反向传OpenSquilla重新定义AI智能体经济学:Token效率成为智能新标尺OpenSquilla从相对默默无闻的状态一跃成为AI智能体领域最受讨论的开源项目之一,单日内在GitHub上收获超过4100颗星。该框架的核心论点是:AI行业一直在衡量错误的指标。当大多数基准测试聚焦于原始性能——MMLU上的准确率、Hu查看来源专题页GitHub 已收录 2668 篇文章

时间归档

June 20261457 篇已发布文章

延伸阅读

Envoy Proxy:云原生流量管理背后看不见的脊梁Envoy Proxy 已成为云原生流量管理领域事实上的数据平面。这篇深度分析将拆解其架构、竞争优势,以及它在现代微服务生态系统中扮演的关键角色。NVIDIA Eagle视觉语言模型:以数据为中心,重新定义多模态理解NVIDIA的Eagle视觉语言模型通过优先保证数据质量而非模型规模,实现了业界领先的性能。其开源数据管道为行业提供了可复现的基准,标志着多模态理解领域正转向以数据为中心的AI范式。提示调优:悄然重塑AI效率的微型技术Google Research 于2021年提出的提示调优(Prompt Tuning)证明,向冻结的语言模型添加一组可学习的“软提示”令牌,即可媲美全参数微调的性能。这项技术已成为参数高效微调(PEFT)的基石,让大规模模型能以极低计算成OpenSquilla重新定义AI智能体经济学:Token效率成为智能新标尺开源AI智能体框架OpenSquilla提出颠覆性理念:衡量智能不应只看原始能力,而应关注每个Token产出的智能密度。通过优化智能体内部通信与决策逻辑,它声称能在相同预算下实现更高的智能密度,向当前主流的暴力扩展范式发起挑战。

常见问题

GitHub 热点“Envoy Ratelimit: The Unsung Hero of Distributed Traffic Control”主要讲了什么?

The envoyproxy/ratelimit project is not just another rate limiter; it is a purpose-built, distributed service designed to solve one of the hardest problems in modern microservices:…

这个 GitHub 项目在“envoyproxy ratelimit vs Kong rate limiting performance comparison”上为什么会引发关注?

At its core, envoyproxy/ratelimit is a gRPC server that implements the Envoy Rate Limit Service (RLS) API. The architecture is deceptively simple but highly effective. The service is stateless from a request-handling per…

从“how to configure sliding window rate limit in envoyproxy ratelimit”看,这个 GitHub 项目的热度表现如何?

当前相关 GitHub 项目总星标约为 2661,近一日增长约为 0,这说明它在开源社区具有较强讨论度和扩散能力。