RevenueCat 广泛使用缓存来提高其产品 API 的可用性和性能,同时确保 API 的一致性。该公司分享了其交付平台所采用的技术,该平台每天可以处理超过 12 亿个 API 请求。RevenueCat 团队开发了一个开源的 memcache 客户端,提供了多个高级特性。
缓存)是实现快速数据检索的一种众所周知的解决方案,相比于从数据库系统中获取记录或即时重新计算,它能够实现更快的数据检索。在现代分布式架构中利用缓存的方法有很多,但它们都力求确保低延迟、数据可用性、新鲜度和一致性。
RevenueCat 通过在客户端库和缓存服务器之间池化连接,避免在缓存数据检索期间进行不必要的 TCP 握手,实现了缓存层的低延迟。他们开源的Memcache客户端库遵循最佳实践并提供默认的配置值。他们确定使用低超时和避免客户端重试能够获得最佳结果。相反,在出现缓存可用性问题的情况下,客户端将服务器标记为不可用,并回退到数据源。它还依赖 TCP 协议来重新建立与缓存服务器的正常连接。
RevenueCat 专注于规划其缓存基础设施,以最小化不可避免的故障影响,同时也考虑到小型缓存服务器受到热键分布的影响更大。规划包括在了解缓存节点发生故障时后端服务的容量的基础上确定缓存服务器的数量和大小。
使用镜像池的故障影响(来源:RevenueCat工程博客)
RevenueCat 使用各种技术来管理和操作其缓存层,包括回退池(客户端回退到镜像池或旨在存储最热键的槽池)、用于特定用例的专用池、用于热键的键拆分或本地缓存、重新缓存、过时或租赁策略(避免热键发生惊群效应)。
工程团队提供了一些关于重新分片或迁移缓存集群的技巧。一致性哈希算法有助于在增加缓存容量时避免使缓存变冷。迁移可以由缓存客户端驱动,避免额外的迁移活动并确保顺利执行。
影响缓存一致性的竞态条件(来源:RevenueCat工程博客)
最后,RevenueCat 工程师描述了解决缓存一致性挑战的常见策略,包括比较并交换(compare-and-swap)、租约、重新缓存策略、将键标记为过时、仅降低键TTL或写入故障跟踪。RevenueCat 的 Python 内存缓存客户端库为CRUD操作提供了处理缓存一致性的支持。
InfoQ 就一些问题采访了 RevenueCat 的工程主管Guillermo Pérez。
InfoQ:缓存一致性被认为是计算中最具挑战性的事情之一。在大规模缓存数据时,需要考虑哪些关键因素?
Guillermo Pérez: 首先,我建议确定你真正需要什么样的一致性水平。在许多情况下,一个简单的具有合理低 TTL 的缓存可能足够了,你不需要为此构建任何复杂的东西。在 RevenueCat,鉴于我们所处理的数据类型,我们确实需要强一致性。如果你需要良好的一致性,关键是要具备良好的可见性,通过定时重新检查缓存项来检测和报告不一致性,这样就可以实现监视、跟踪和检测回归。
InfoQ:RevenueCat 的 Memcache Python 库提供了你在文章中所描述的许多优秀的特性。你能为使用不同语言栈的工程师推荐一些库或材料吗?
Guillermo Pérez: 我建议从了解mcrouter开始,它实现了一些有用的路由策略并支持 memcache 协议,因此你可以在任何一门语言的 memcache 客户端中使用它。
尽管新的 memcache 协议确实有助于实现一些高级语义,但绝大多数缓存管理可以使用当前的协议来实现。
写失败跟踪器很重要,但它也很容易实现,你可以重用服务中可靠的日志记录。
最后,我建议在应用程序代码中构建一个数据访问层,抽象所有数据获取的详细信息,这样你就可以演进、添加缓存策略等,而无需进行复杂的应用程序重构。你越早这样做,就越能为扩展做好准备。
你还可以在 InfoQ 上阅读关于DoorDash如何重新设计其缓存以提高可伸缩性和性能的文章。
原文链接:
https://www.infoq.com/news/2024/01/revenuecat-cache-management/
评论