介绍
缓存是一种强大的技术,广泛应用于计算机系统的各个方面,从硬件缓存到操作系统、网络浏览器,尤其是后端开发 。对于Meta这样的公司来说,缓存尤为重要,因为它有助于减少延迟、扩展繁重的工作负载并节约成本 。由于他们的用例非常依赖缓存 , 这带来另一系列问题,即缓存失效 。
多年来,Meta已经将他们的缓存一致性指标从99.9999%(6个9)提高到99.99999999%(10个9),这意味着在其缓存集群中,每十亿次缓存写入中,不一致的写入次数将少于1次 。
本文将重点讨论以下内容:
- 什么是缓存失效和缓存一致性?
- 为什么Meta对缓存一致性如此重视,甚至6个9的准确率都无法满足需求?
- Meta的监控系统如何帮助他们改善缓存失效和缓存一致性,并修复错误的?
顾名思义,缓存并不保存数据的原始来源,因此当原始来源的数据发生变化时,应该有一个主动使陈旧缓存条目失效的过程 。如果在失效过程中处理不当,可能会在缓存中无限期地留下与原始来源不一致的值 。
那么,我们如何使缓存失效呢?
我们可以设置TTL(生存时间)来维持缓存的新鲜度,由此就没有其他系统会导致缓存失效了 。但是,在本文的主题是Meta的缓存一致性,我们将假设使缓存失效的操作是由缓存本身以外的其它系统执行的 。
首先,让我们看看缓存不一致是如何产生的:

文章插图
请假设1、2、3、4是依次递增的时间戳 。
- 缓存首先尝试从数据库中填充值 。
- 但在x=42的值到达缓存之前,某个操作更新了数据库,将x的值改为43 。
- 数据库发送了x=43的缓存失效事件,并在x=42到达缓存之前到达了缓存,于是缓存的值被设置为43 。
- 现在 , 事件x=42到达缓存,缓存的值被设置为42 , 于是引入了不一致性 。
二、为什么Meta如此重视缓存一致性?
从Meta的角度来看,缓存不一致几乎与数据库数据丢失一样糟糕,而从用户的角度来看,缓存不一致可能导致糟糕的体验 。
当你在Instagram上给用户发送私信(DM)时,后台会有一个用户到主存储器(用户信息就存储在主存储器)的映射,用户的信息就存储在主存储器中 。
想象一下这里有三个用户:Bob、Mary和Alice 。这两个用户都给Alice发送了消息 。Bob在美国 , Alice在欧洲,而Mary在日本 。因此,系统会查询离用户最近的区域,并将消息发送到Alice的数据存储区 。在这种情况下,当TAO(The Associations and Objects,Meta的社交图谱存储系统)副本查询Bob和Mary所在的区域时 , 它们都有不一致的数据,并将消息发送到了没有任何Alice消息的区域 。

文章插图
在上述情况下,将会出现消息丢失和糟糕的用户体验,因此这是Meta需要解决的首要问题之一 。
三、监控
要解决缓存失效和缓存一致性问题 , 首先要进行测量 。如果我们能够准确测量缓存一致性 , 并在缓存中出现不一致条目时发出警报,就能发现问题 。然而Meta确保其测量结果不包含任何误报,只是因为值班工程师会忽略警报,由此指标就失去可信度和可用性 。
在深入探讨Meta实施的解决方案之前,最简单的解决方案将是记录并跟踪缓存的每次状态变化 。在工作负载较小的情况下,这个方案是可行的 , 但Meta的系统每天的缓存填充量超过10万亿次 。记录和跟踪所有缓存状态,会将已经很重的缓存工作负载变成更加沉重,我们甚至不想考虑如何调试它 。
四、Polaris
宏观来看,Polaris作为客户端与有状态服务进行交互,并假定其对服务内部结构一无所知 。Polaris基于“缓存最终应与数据库一致”的原则工作 。Polaris接收失效事件后会查询所有副本 , 以验证是否发生其他违规情况 。
例如:如果Polaris接收到x=4版本4的失效事件 , 它以客户端身份检查所有缓存副本,以验证是否发生其他违规情况 。如果一个副本返回x=3@版本3,Polaris会将其标记为不一致,并重新获取样本 , 以便稍后与同一目标缓存主机进行检查 。Polaris会在特定的时间尺度(例如,一分钟、五分钟或十分钟)内报告不一致性 。
推荐阅读
- Rust编程语言的内存安全与性能:如何平衡?
- AI未来或超越“最聪明的人”?专家谈发展如何兼顾公平
- 荒漠治理的例子 如何在荒漠有效治沙
- 筹码分布图怎么看 如何看套牢盘
- word如何横向布局和纵向,word要如何才可以竖向排版
- 牡丹的生长地在哪,牡丹花的生长过程 牡丹花的生长过程如何
- 木耳如何保存 木耳怎么保存,泡发的木耳怎么保存到第二天
- 45岁TVB男星将要离巢,现已停止拍摄工作,曾因无缘争奖感失望
- 如何制作牛仔裤破洞 怎么制作牛仔裤破洞
- 冰箱过载保护器怎么选型号,怎样挑选冰箱 如何挑选冰箱
