DoorDash 重新构建异构缓存系统
DoorDash 重新设计了其微服务中使用的异构缓存系统,创建了一个通用、多层次的缓存,提供了一种通用机制,并解决了因采用分散缓存而带来的诸多问题。
缓存的重要性
缓存是一种常见的优化系统性能的机制,无需进行昂贵的优化。DoorDash 的工程师 Lev Neiman 和 Jason Fan 解释说,在 DoorDash 的案例中,实现业务逻辑的优先级高于性能优化,因此缓存尤为重要。
原有缓存系统的问题
DoorDash 的不同团队依赖于不同的缓存系统,包括 Caffeine、Redis Lettuce 和 HashMaps。这导致他们反复遇到并解决相同的问题,如缓存陈旧、对 Redis 的严重依赖、键模式不一致等。因此,一组工程师开始为所有 DoorDash 微服务创建一个共享的缓存库,首先应用于 DashPass 服务,该服务因流量增加而面临扩展挑战和频繁故障。
新缓存系统的设计
通用 API 的定义
第一步是定义一个基于两个 Kotlin 接口的通用 API:CacheManager 用于为特定键类型创建新缓存和回退方法,CacheKey 类则抽象了键类型。这使得 DoorDash 能够使用依赖注入和多态性,在业务逻辑中保持统一的缓存调用。
多层次缓存设计
DoorDash 工程师选择了三层次的设计,以进一步优化性能:
- 请求本地缓存:数据存储在哈希表中,其生命周期与请求绑定。
- 本地缓存:使用 Caffeine 在同一 Java 虚拟机内的所有工作线程之间共享数据。
- Redis 缓存:在同一 Redis 集群中的所有 pod 中可见,使用 Redis Lettuce。
运行时控制
多层次的缓存系统具有运行时控制功能,可以单独为每一层启用或禁用缓存、设置缓存存活时间(TTL)或启用影子模式(即一定比例的缓存请求与真实数据源进行比较)。此外,缓存系统还支持指标收集,包括命中率、未命中率、缓存延迟等,并支持日志记录。
缓存系统的推广
在 DashPass 服务中成功应用后,新的缓存系统逐步推广到整个组织,并提供了明确的指导,说明何时以及如何使用或不使用它。
成果
根据 Neiman 和 Fan 的说法,新的缓存系统提高了所有服务的可扩展性和安全性,同时也使团队在需要时能够轻松地采用缓存来提高性能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。