DoorDash如何重新架构其缓存以提高可扩展性和性能

DoorDash 重新构建异构缓存系统

DoorDash 重新设计了其微服务中使用的异构缓存系统,创建了一个通用、多层次的缓存,提供了一种通用机制,并解决了因采用分散缓存而带来的诸多问题。

缓存的重要性

缓存是一种常见的优化系统性能的机制,无需进行昂贵的优化。DoorDash 的工程师 Lev Neiman 和 Jason Fan 解释说,在 DoorDash 的案例中,实现业务逻辑的优先级高于性能优化,因此缓存尤为重要。

原有缓存系统的问题

DoorDash 的不同团队依赖于不同的缓存系统,包括 Caffeine、Redis Lettuce 和 HashMaps。这导致他们反复遇到并解决相同的问题,如缓存陈旧、对 Redis 的严重依赖、键模式不一致等。因此,一组工程师开始为所有 DoorDash 微服务创建一个共享的缓存库,首先应用于 DashPass 服务,该服务因流量增加而面临扩展挑战和频繁故障。

新缓存系统的设计

通用 API 的定义

第一步是定义一个基于两个 Kotlin 接口的通用 API:CacheManager 用于为特定键类型创建新缓存和回退方法,CacheKey 类则抽象了键类型。这使得 DoorDash 能够使用依赖注入和多态性,在业务逻辑中保持统一的缓存调用。

多层次缓存设计

DoorDash 工程师选择了三层次的设计,以进一步优化性能:

  1. 请求本地缓存:数据存储在哈希表中,其生命周期与请求绑定。
  2. 本地缓存:使用 Caffeine 在同一 Java 虚拟机内的所有工作线程之间共享数据。
  3. Redis 缓存:在同一 Redis 集群中的所有 pod 中可见,使用 Redis Lettuce。

运行时控制

多层次的缓存系统具有运行时控制功能,可以单独为每一层启用或禁用缓存、设置缓存存活时间(TTL)或启用影子模式(即一定比例的缓存请求与真实数据源进行比较)。此外,缓存系统还支持指标收集,包括命中率、未命中率、缓存延迟等,并支持日志记录。

缓存系统的推广

在 DashPass 服务中成功应用后,新的缓存系统逐步推广到整个组织,并提供了明确的指导,说明何时以及如何使用或不使用它。

成果

根据 Neiman 和 Fan 的说法,新的缓存系统提高了所有服务的可扩展性和安全性,同时也使团队在需要时能够轻松地采用缓存来提高性能。

阅读 22
0 条评论