DoorDash 开发了 Entity Cache,这是一个透明代理缓存平台,旨在减少微服务架构中对频繁访问但不常变更数据的重复请求。这类重复请求通常会增加后端负载、消耗额外的计算资源,并在微服务生态扩展时导致尾延迟上升。DoorDash 表示,该平台支持 50 个服务的 100 多个端点,提供超过每秒 1.5M 的请求量,并保持 99.99999% 的可用性。 Entity Cache 基于 Envoy 和 Valkey 构建,在 DoorDash 基于 Envoy 的服务网格内运行,拦截到达上游服务之前的 HTTP 和 gRPC 请求。该平台通过在客户端服务和上游应用之间放置透明代理,将缓存移动到基础设施层。服务无需修改应用代码即可继续发起现有请求,缓存行为则通过服务网格集中管理。 DoorDash 将这种做法描述为不仅仅是传统的缓存层。Entity Cache 不是单一的优化,而是一组针对可靠性和性能的特性集合,以实现在 DoorDash 规模下的协同工作。该平台将缓存、失效、故障处理、请求协调与性能优化结合在一起,以支持高流量的内部服务通信。当请求到达 Entity Cache 时,代理会向 Valkey 检查是否存在有效的缓存响应。命中缓存的响应会被直接返回,未命中的请求则转发到上游服务。返回的响应会根据配置策略存储起来并返回给请求服务。这种方式使团队能够采用集中式缓存,而无需在各个应用内实现独立的解决方案。 在大规模环境下,保持缓存的新鲜度与可靠性需要谨慎权衡。Entity Cache 使用基于 Kafka 的事件驱动失效机制,通过对比更新时间戳与缓存响应来刷新过期条目,而无需分布式删除缓存。双重 TTL 阈值允许在故障期间返回略微过期的响应,而 Envoy 在检测到不健康的缓存实例时会将其移除并直接将请求路由到上游服务。 DoorDash 还描述了该设计在生产故障期间所提供的帮助。在一次持续数小时的上游故障中,该设计至关重要:Entity Cache 继续提供略有过期但有效的缓存数据,而不是失败。 为了支持高请求量,DoorDash 对 Entity Cache 的若干组件进行了优化。该平台使用自定义缓冲池以减少内存分配开销、无锁的 single-flight 机制以在缓存未命中时防止重复计算,并基于 XFetch 算法实现概率性提前刷新以降低缓存雪崩的风险。XFetch 使得被频繁访问的条目在到期前被刷新,从而降低大量请求同时遇到过期条目的可能性。 DoorDash 表示,这些优化将分配率降低了 50% 到 60%,每个 pod 的吞吐量提高约五倍,并将 P99 延迟峰值降低了最多 80%。公司还报告了超过 90% 的缓存命中率、正常运行期间上游请求减少 60% 到 95%、新接入端点的延迟改善最高达 90%,以及大约 2.1 毫秒的 P99 代理开销。

打开网易新闻 查看精彩图片