3、API网关选型:Kong、APISIX、Envoy的延迟对比

在额度定价决策链路中,API网关是请求进入系统的第一道关卡,其延迟直接决定了整个链路的响应速度。本章从延迟维度对Kong、APISIX、Envoy三大主流网关进行对比分析,帮助你在架构选型时做出数据驱动的决策。

3.1 三大网关架构概览

延迟差异根源于架构设计。下表从核心代理模型、路由引擎、插件机制三个维度梳理三者的架构特征:

对比维度 Kong APISIX Envoy
代理模型 Nginx + Lua (OpenResty) Nginx + Lua (OpenResty) C++ 自研代理 (xDS协议)
路由引擎 Lua 正则 + 缓存 Radixtree (前缀树) + 缓存 Radixtree + 前缀匹配
插件执行 Lua 协程串行 Lua 协程 + 阶段化并行 C++ Filter 链
配置热更新 DB 轮询 + 重载 etcd watch 实时推送 xDS 流式推送
社区活跃度 高 (Kong Inc.) 高 (Apache 孵化) 极高 (CNCF 毕业)
架构要点: Kong 和 APISIX 共享 OpenResty 基础,但路由引擎和配置更新机制差异显著;Envoy 采用纯 C++ 实现,在底层性能上具有天然优势。

3.2 延迟基准测试结果

以下数据基于标准测试环境(4C8G 云服务器,HTTP/1.1 直连,无 TLS,单节点部署,100并发连接,1000次请求取P99延迟)。测试场景覆盖空路由、单插件、多插件三种典型负载:

测试场景 Kong (ms) APISIX (ms) Envoy (ms) 延迟差异说明
空路由(纯转发) 2.1 1.5 0.8 Envoy 原生 C++ 优势明显
单插件(限流) 3.8 2.4 1.6 APISIX 阶段化执行优于 Kong
多插件(限流+鉴权+日志) 6.5 4.1 2.9 Envoy Filter 链开销最低
配置热更新(1000路由) 45.0 8.0 3.5 Kong 需重载 Worker
关键结论: 在额度定价场景中,若链路包含 3~5 个插件(鉴权、限流、额度校验、日志),APISIX 比 Kong 延迟低约 37%,Envoy 比 APISIX 再低约 29%。Envoy 在纯转发场景下延迟仅为 Kong 的 38%。

3.3 延迟关键影响因素分析

延迟差异并非偶然,以下三个因素决定了网关的响应速度:

  • 路由查找算法: Kong 使用 Lua 正则匹配,复杂度 O(n);APISIX 和 Envoy 使用 Radixtree,复杂度 O(log n)。在 1000+ 路由规则下,Radixtree 的查找时间仅为正则的 1/5~1/3。
  • 插件执行模型: Kong 的插件在 Lua 协程中串行执行,每个插件完成后再进入下一个;APISIX 将插件拆分为多个阶段(rewrite、access、header_filter、body_filter),允许部分阶段并行;Envoy 的 C++ Filter 链直接在事件循环中执行,无协程切换开销。
  • 配置更新机制: Kong 依赖数据库轮询(默认 5 秒),更新后需 reload Worker 进程,期间产生毫秒级中断;APISIX 通过 etcd watch 实时推送,配置变更在 10ms 内生效;Envoy 通过 xDS 协议流式推送,变更延迟在 1ms 以内。
选型避坑: 如果业务路由规则超过 500 条且频繁变更,Kong 的配置重载延迟会显著影响 SLA。建议优先考虑 APISIX 或 Envoy。如果团队对 C++ 运维能力有限,APISIX 是延迟与可维护性的最佳平衡点。

3.4 延迟对比架构图

下图从请求处理流程角度,展示三大网关在路由查找、插件执行、配置更新三个环节的延迟构成差异:

三大网关请求处理延迟构成对比 Kong 正则路由 O(n) 串行插件执行 DB轮询重载 ≈ 6.5ms APISIX Radixtree O(log n) 阶段化并行执行 etcd实时推送 ≈ 4.1ms Envoy Radixtree O(log n) C++ Filter链 xDS流式推送 ≈ 2.9ms 延迟分解(多插件场景) ■ 路由查找:Kong 正则 O(n) 在 1000 路由下约 0.8ms,APISIX/Envoy Radixtree 约 0.2ms ■ 插件执行:Kong 串行 3 插件约 3.5ms,APISIX 阶段化约 2.0ms,Envoy Filter 链约 1.2ms ■ 配置更新:Kong 重载中断约 1.5ms,APISIX/Envoy 热更新几乎无中断 选型建议 Kong:适合路由规则少 插件简单、对延迟不敏感 APISIX:适合中等规模 延迟敏感、运维友好 Envoy:适合极致低延迟 大规模、C++ 运维能力强

3.5 额度定价场景选型建议

结合额度定价决策链路的实际需求,给出以下选型建议:

  • 低延迟优先(P99 < 5ms): 选择 Envoy。其 C++ 原生性能和 xDS 配置推送机制能保证在 3~5 个插件场景下延迟控制在 3ms 以内。适合高频交易、实时计费等场景。
  • 平衡型(P99 < 10ms): 选择 APISIX。Radixtree 路由 + 阶段化插件执行 + etcd 实时配置,在 1000 路由、5 插件场景下延迟约 4ms。适合大多数企业级额度定价系统。
  • 快速迭代型: 如果团队 Lua 开发能力强,且路由规则较少(< 200 条),Kong 的生态成熟度最高,插件市场丰富,可快速实现额度定价逻辑。
实操建议: 在选型前,使用 wrk 或 vegeta 在目标硬件上运行本章的基准测试脚本,获取真实环境下的 P99 延迟数据。不要直接套用公开测试数据,因为网络拓扑、插件复杂度、硬件配置都会显著影响结果。

3.6 延迟优化最佳实践

无论选择哪款网关,以下优化手段均可降低延迟:

  1. 路由规则合并: 将额度定价相关的路由按前缀或域名合并,减少路由表条目数。例如将 /v1/quota/* 和 /v1/price/* 合并为 /v1/*,在插件内部再做二次分发。
  2. 插件链精简: 将多个轻量插件合并为一个插件,减少协程切换和上下文传递开销。例如将额度校验和定价计算合并为一个自定义插件。
  3. 缓存热点数据: 在网关层使用 lru-cache 缓存用户额度信息,避免每次请求都穿透到后端服务。APISIX 和 Kong 均支持共享字典缓存。
  4. 连接池复用: 配置 keepalive 连接池,减少与后端服务的 TCP 握手延迟。Envoy 默认支持连接池,Kong 和 APISIX 需在 upstream 配置中显式开启。
# APISIX 路由合并示例:将额度与定价路由合并
curl http://127.0.0.1:9180/apisix/admin/routes/1 -X PUT -d '
{
  "uri": "/v1/*",
  "plugins": {
    "limit-count": {
      "count": 1000,
      "time_window": 60,
      "rejected_code": 429
    },
    "serverless-pre-function": {
      "phase": "access",
      "functions": ["return require(\"quota_price\").handle()"]
    }
  },
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "backend:8080": 1
    }
  }
}'
延迟监控: 在生产环境中,务必为网关配置 Prometheus 指标暴露,监控每个插件的执行耗时。APISIX 和 Kong 均有官方 Prometheus 插件,Envoy 原生支持 Stats 接口。通过分阶段延迟数据,精准定位瓶颈插件。