1. Envoy缓存基础:架构、数据面位置与灾备关系

1.1 Envoy架构概述

Envoy 是一款高性能、可编程的七层代理,采用 主从多线程 + 事件驱动 架构。其核心组件围绕 Listener、Filter Chain、Cluster 和 Config 四大抽象构建,形成数据面与控制面分离的现代代理模型。

架构要点: Envoy 通过 LDS(Listener Discovery Service)、RDS(Route Discovery Service)、CDS(Cluster Discovery Service)和 EDS(Endpoint Discovery Service)实现动态配置下发,数据面无需重启即可热更新路由与缓存策略。
组件 职责 与缓存的关系
Listener 监听端口,接收入站流量 可绑定缓存过滤器,决定哪些请求进入缓存逻辑
Filter Chain 按序处理请求/响应 缓存模块作为 HTTP 过滤器插入链中
Cluster 定义上游服务端点集合 缓存命中时直接返回,避免转发到 Cluster
Config 动态或静态配置管理 缓存规则、大小、TTL 均由配置驱动
Envoy 核心架构与缓存模块位置 控制面(Control Plane)— xDS 动态配置下发 数据面(Data Plane) Listener Filter Chain(HTTP 过滤器链) 缓存过滤器 其他过滤器 Router Cluster 本地缓存存储 LRU / TTL 淘汰 缓存过滤器位于 Filter Chain 中,命中时直接返回响应;未命中则继续经 Router 转发至 Cluster。

1.2 缓存模块在数据面中的位置

Envoy 的缓存能力通过 HTTP Cache Filter 实现,该过滤器插入在 HTTP 连接管理器(HCM) 的过滤器链中。其位置决定了缓存策略的执行时机:

  • 前置位置: 在 Router 过滤器之前,确保缓存命中时直接短路返回,不经过上游转发。
  • 请求路径: 检查请求是否可缓存(GET/HEAD + 无 Authorization 头等),若命中则直接构造响应。
  • 响应路径: 上游返回后,根据 Cache-Control、Expires 等头部决定是否存入缓存。
生产建议: 缓存过滤器应放置在 Router 过滤器之前,且通常位于 故障注入过滤器之后,以便在注入故障前完成缓存命中判断,避免误注入影响缓存路径。
过滤器链位置 典型过滤器 对缓存的影响
第 1 层 故障注入 / 限流 缓存请求可能被限流拦截,需配置白名单
第 2 层 HTTP Cache Filter 核心缓存逻辑,命中即返回
第 3 层 Router / 重写 / 重试 未命中时继续转发,重试可能引发缓存穿透
第 4 层 上游连接池 / 负载均衡 缓存未命中时选择后端实例

1.3 缓存与灾备的关系

在灾备场景中,缓存承担 流量兜底 和 数据面降级 的双重角色。当上游集群故障或网络分区时,缓存模块成为保障服务可用的最后一道屏障。

缓存灾备兜底流程 客户端请求 Envoy 数据面 缓存过滤器 缓存命中 直接返回响应 缓存未命中 转发至上游 上游集群 正常 / 故障 灾备降级:返回过期缓存 或 503 友好页面 灾备策略:上游故障时,缓存模块可配置为返回过期缓存(stale-while-revalidate)或降级响应,避免完全不可用。

1.4 缓存灾备的关键设计原则

  • 缓存即兜底: 当上游集群健康检查失败或超时比例超过阈值时,Envoy 可自动切换至缓存响应模式。
  • 过期缓存可用: 通过 stale-while-revalidate 和 stale-if-error 指令,允许在故障期间返回过期缓存。
  • 缓存隔离: 缓存存储与上游集群故障域隔离,避免级联故障影响缓存层。
  • 可观测性: 缓存命中率、过期命中率、降级次数等指标必须纳入巡检监控体系。
常见误区: 将缓存仅视为性能优化手段,忽略其在灾备中的兜底作用。未配置 stale-if-error 的缓存策略,在上游故障时仍会穿透到故障集群,导致缓存雪崩。

1.5 本章小结

Envoy 的缓存模块位于数据面过滤器链的核心位置,通过 HTTP Cache Filter 实现请求级缓存。在灾备场景中,缓存从性能加速器转变为 高可用兜底组件。理解缓存与灾备的关系,是后续进行命中率巡检和故障排查的前提。