欢迎参与 8 月 1 日中午 11 点的线上分享,了解 GreptimeDB 联合处理指标和日志的最新方案! 👉🏻 点击加入

Skip to content
On this page
技术
2025-1-9

充分释放 Vector 的能量 | 自适应限流机制详解

本文对 Vector 的自适应限流(ARC)解决方案做一个详细介绍。

为什么需要自适应限流

Vector 作为一款用 Rust 编写、高性能的、端到端的可观测数据 Pipeline,经常会遇到上下游处理速率不匹配的场景:大多数时候 Vector 的实际吞吐都大于下游数据库(比如 Elasticsearch 或者 ClickHouse)的处理能力。

**为了不让下游服务过载,Vector 通常会提供限流机制。**比如在 HTTP Sink 中,用户可以配置 request.rate_limit_duration_secsrequest.rate_limit_num 来进行限速,如下该举例将 Vector 对下游的速率限制在 10 ops:

yaml
sinks:
  my-sink:
    request:
      rate_limit_duration_secs: 1
      rate_limit_num: 10

但静态的限速并非灵丹妙药,它很难适应动态的场景:

  1. 如果限速过低,则意味着发送给下游数据库的流量过少,这可能会使原本可处理更多流量的数据库处于资源过剩的状态;
  2. 如果限速过高,则意味着发送给下游数据库的流量过多,这有可能会使下游数据库过载从而引发雪崩式的系统故障。

事实上,最佳速率总是受限于多种因素,比如 Vector 的实例数量,下游服务的容量和当前发送的数据量等等。显然,静态限速无法根据这些动态变化进行优化。

静态限速的局限性

下图展示了静态限速的局限性:

(图 1:静态限速的局限性)
(图 1:静态限速的局限性)

自适应限流:解决静态限速的瓶颈

为了解决静态限速的局限性,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 Requests503 Service Unavailable),则表示下游服务过载,Vector 会以指数方式减少流量。比如将每秒操作数从 20 减少到 10,再减到 5 等。减少的比例可以通过 request.adaptive_concurrency.decrease_ratio 来配置。

下图展示了 Vector 在 ARC 模式下如何根据系统负载调整流量:

(图 2:Vector 的决策逻辑)
(图 2:Vector 的决策逻辑)

AIMD 算法与 TCP 拥塞控制

AIMD 算法来源于 TCP 拥塞控制算法,广泛应用于网络协议中,以有效地平衡带宽利用和网络稳定性。在 Vector 中,AIMD 帮助系统在保持高吞吐量的同时,避免因过载导致的服务崩溃,保障系统稳定性。

Vector 将 ARC 实现为 Tower Layer,感兴趣的读者可以通过阅读 该文档 来进一步了解 ARC 的具体实现细节。

如何配置 ARC

ARC 目前支持应用于所有支持 HTTP 数据接收的 Sink,以 ClickHouse Sink 为例,用户可以通过以下配置启用自适应限流:

yaml
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

官网:https://greptime.cn/

文档:https://docs.greptime.cn/

Twitter: https://twitter.com/Greptime

Slack: https://greptime.com/slack

LinkedIn: https://www.linkedin.com/company/greptime/

加入我们的社区

获取 Greptime 最新更新,并与其他用户讨论。