写点什么

RevenueCat 借助缓存每天处理超过 12 亿次 API 请求

  • 2024-03-14
    北京
  • 本文字数:1460 字

    阅读完需:约 5 分钟

大小:809.62K时长:04:36
RevenueCat借助缓存每天处理超过12亿次API请求

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/

2024-03-14 08:006390

评论

发布
暂无评论

架构学习模块二作业

架构实战营

架构实战营模块2作业

林子钧

作业 架构实战营 模块二

架构训练营-模块二作业

Neil43

架构训练营

架构实战营第二模块作业

DZ

模块二作业-架构训练营

架构训练营

架构实战营 模块二作业

Dylan

架构实战营

架构实战营模块 2 作业

Lukefang

架构实战营 模块二

Keyto

华仔架构-模块

大师兄

产品经理训练营 Week4 学习心得

Mai

模块二:课后作业

iHai

架构实战营

一文带你更方便的控制 goroutine

万俊峰Kevin

线程 并发 Go 语言 goroutine

架构师实战营 模块二作业 微信朋友圈高性能架构分析

小遵

架构实战营模块 2 作业

梦寻解语花

架构实战营

架构训练营模块2作业

唐江

架构实战营-作业2

大肚皮狒狒

作业

后端服务太多,且涉及多种语言,如何进行高效管理?

我爱娃哈哈😍

架构 架构设计 架构场景实战

产品经理训练营 Week3 学习心得

Mai

微信朋友圈高性能复杂度分析设计

贯通

#架构实战营

微信朋友圈高性能复杂度分析

thewangzl

产品经理训练营Week14学习心得

Mai

架构0期作业2

sjj

模块2—分析一下微信朋友圈的高性能复杂度

sandy

架构实战营

微信朋友圈高性能架构

chenmin

【架构实战营】模块2作业

dragonboa

「架构实战营」第二次作业

高亮

架构实战营

朋友圈高性能复杂度

Simon

架构实战营

Java-技术专题-CountDownLatch的介绍和使用

洛神灬殇

Java AQS CountDownLatch JUC

甲方日常 94

句子

工作 随笔杂谈 日常

模块二-微信朋友圈的高性能复杂度

华仔架构训练营

架构实战营模块 2 学习总结

林子钧

总结 架构实战营 模块二

RevenueCat借助缓存每天处理超过12亿次API请求_后端_Rafal Gancarz_InfoQ精选文章