为什么需要自适应限流
Vector 作为一款用 Rust 编写、高性能的、端到端的可观测数据 Pipeline,经常会遇到上下游处理速率不匹配的场景:大多数时候 Vector 的实际吞吐都大于下游数据库(比如 Elasticsearch 或者 ClickHouse)的处理能力。
**为了不让下游服务过载,Vector 通常会提供限流机制。**比如在 HTTP Sink 中,用户可以配置 request.rate_limit_duration_secs
和 request.rate_limit_num
来进行限速,如下该举例将 Vector 对下游的速率限制在 10 ops:
sinks:
my-sink:
request:
rate_limit_duration_secs: 1
rate_limit_num: 10
但静态的限速并非灵丹妙药,它很难适应动态的场景:
- 如果限速过低,则意味着发送给下游数据库的流量过少,这可能会使原本可处理更多流量的数据库处于资源过剩的状态;
- 如果限速过高,则意味着发送给下游数据库的流量过多,这有可能会使下游数据库过载从而引发雪崩式的系统故障。
事实上,最佳速率总是受限于多种因素,比如 Vector 的实例数量,下游服务的容量和当前发送的数据量等等。显然,静态限速无法根据这些动态变化进行优化。
静态限速的局限性
下图展示了静态限速的局限性:
自适应限流:解决静态限速的瓶颈
为了解决静态限速的局限性,Vector 团队参考了 Netflix 博客《Performance Under Load》 中的经验,并设计了自适应限流机制(Adaptive Request Concurrency,简称 ARC)。启用 ARC 后,Vector 会基于当前的系统统计信息自动调整数据流速率,从而最大化系统的处理能力,避免了静态限速机制下可能出现的资源浪费和过载问题。
ARC 如何工作
启用 ARC 后,Vector 会监控两个关键指标来动态调整流量控制策略:
- RTT(Round Trip Time): 请求的往返延迟,反映了请求的响应速度。
- HTTP 响应码: 代表请求的成功与失败,尤其是错误响应码(如 429 和 503)能指示下游服务的健康状态。
基于这两个指标,Vector 使用 AIMD(Additive Increase Multiplicative Decrease)算法动态调整流量:
- Additive Increase(加性增加): 如果 RTT 下降或保持稳定且 HTTP 响应码为成功(如 200 OK),则表示下游服务仍能处理更多流量,Vector 会线性地增加吞吐量。例如,将每秒的操作数从 10 增加到 11,再增加到 12 等。
- Multiplicative Decrease(乘性减少): 如果 RTT 上升或 HTTP 响应码返回错误(如
429 Too Many Requests
或503 Service Unavailable
),则表示下游服务过载,Vector 会以指数方式减少流量。比如将每秒操作数从 20 减少到 10,再减到 5 等。减少的比例可以通过request.adaptive_concurrency.decrease_ratio
来配置。
下图展示了 Vector 在 ARC 模式下如何根据系统负载调整流量:
AIMD 算法与 TCP 拥塞控制
AIMD 算法来源于 TCP 拥塞控制算法,广泛应用于网络协议中,以有效地平衡带宽利用和网络稳定性。在 Vector 中,AIMD 帮助系统在保持高吞吐量的同时,避免因过载导致的服务崩溃,保障系统稳定性。
Vector 将 ARC 实现为 Tower Layer,感兴趣的读者可以通过阅读 该文档 来进一步了解 ARC 的具体实现细节。
如何配置 ARC
ARC 目前支持应用于所有支持 HTTP 数据接收的 Sink,以 ClickHouse Sink 为例,用户可以通过以下配置启用自适应限流:
sinks:
clickhouse_internal:
type: clickhouse
inputs:
- log_stream_1
- log_stream_2
host: http://clickhouse-prod:8123
table: prod-log-data
request:
concurrency: adaptive
通过这种配置,Vector 将以自适应限流的方式将数据写入 ClickHouse 中。启用 ARC 后,Vector 会根据系统的实时状态自动调整数据发送的速率,确保在不同负载情况下,系统都能保持稳定运行并高效处理数据。
总结
自适应限流(ARC)是 Vector 面对现代复杂系统中上下游速率不匹配问题的有效解决方案。通过实时监控 RTT 和 HTTP 响应码,Vector 可以动态调节请求速率,从而最大化资源利用率并确保下游数据库的健康运行。与静态限流机制相比,ARC 在保证系统稳定性的同时,能够更灵活、智能地应对变化的负载,从而提高整体系统的效率和可靠性。
关于 Greptime
Greptime 格睿科技专注于为可观测、物联网及车联网等领域提供实时、高效的数据存储和分析服务,帮助客户挖掘数据的深层价值。目前基于云原生的时序数据库 GreptimeDB 已经衍生出多款适合不同用户的解决方案,更多信息或 demo 展示请联系下方小助手(微信号:greptime)。
欢迎对开源感兴趣的朋友们参与贡献和讨论,从带有 good first issue 标签的 issue 开始你的开源之旅吧~期待在开源社群里遇见你!添加小助手微信即可加入“技术交流群”与志同道合的朋友们面对面交流哦~
Star us on GitHub Now: https://github.com/GreptimeTeam/greptimedb
Twitter: https://twitter.com/Greptime
Slack: https://greptime.com/slack