Meta 如何实现 99.99999999% 的缓存一致性

曾经的故事

Meta(Facebook) 曾经运行一个简单的技术栈——PHP 和 MySQL。

但随着更多用户的加入,他们面临着可扩展性问题。因此他们建立了一个分布式缓存。

虽然这暂时解决了可扩展性问题,但保持缓存数据的新鲜度变得困难。以下是一种常见的数据不一致场景:

  1. 客户端查询缓存中的x,但缓存中不存在该值。
  2. 因此缓存会向数据库查询:x = 0
  3. 与此同时,数据库中的x发生了变化:x = 1
  4. 但缓存失效事件先到达缓存,缓存中的x发生变更:x = 1
  5. 然后第2步中查询到的x=0再次更新x值:x = 0

现在数据库中的值:x = 1,而缓存中的值:x = 0。所以存在缓存和数据库中的数据不一致。

尽管缓存不一致出现的概率很小,但是Meta 的用户增长速度却是爆炸性的,很快成为全球访问量第三大的网站。
在这里插入图片描述

现在他们每天处理一千万亿(10^15)个请求。所以即使有1%的缓存未命中率其代价也是昂贵的——每天有10万亿次缓存填充。

这篇文章介绍了 Meta 如何利用可观测性来提高缓存一致性。

缓存一致性

从用户的角度来看,缓存**不一致就像数据丢失一样。**因此他们创建了一个可观察性解决方案。以下是他们的做法:

1. 监控

Meta的开发人员开发了一个单独的服务来监控缓存不一致问题,并将该服务命名为Polaris
在这里插入图片描述

Polaris 的工作原理如下:

  • 它像一个缓存服务器一样工作,并接收缓存失效事件,当数据库中的数据发生变化时,失效事件会发送到缓存服务器和 Polaris。
  • 然后Polaris 会向缓存服务器查询数据,检查缓存中的数据是否与数据库中的数据一致。
  • 如果发现数据不一致,Polaris 会将这些缓存服务器加入队列,稍后再次检查,在必要时会从数据库中获取最新的数据,并将其更新到缓存中。以确保数据的一致性。
  • 它在写入期间检查数据的正确性,因此可以更快地发现缓存不一致

这里还是举一个例子来帮助理解Polaris 的工作原理:假设有一个电商网站,它使用缓存来加速用户访问产品信息的速度。缓存中存储了产品的价格、库存等信息,而这些数据的原始来源是数据库。

  • 数据库更新:某个商品的库存从10件增加到20件,数据库发送了一个缓存失效事件。
  • Polaris 接收事件:Polaris 收到了这个失效事件,并开始工作。
  • 查询缓存服务器:Polaris 向缓存服务器查询该商品的信息,发现缓存中的库存还是10件,与数据库中的20件不一致。
  • 排队并再次检查:Polaris 将这个缓存服务器排队,稍后再次检查和刷新缓存,确保缓存中的数据更新为20件。
  • 在写入时检查:现在,假设有另一个用户在短时间内再次购买商品:库存从20件减少到19件。在这个写入操作发生时,Polaris 会再次检查缓存中的数据,确保缓存中的数据是最新的19。如果发现缓存中的数据不正确(例如,缓存中显示的是20件,而实际库存已经变为19件),Polaris 会立即更新缓存,确保缓存和数据库中的数据保持一致。

此外,分布式缓存与 Polaris 之间存在网络分区的风险。因此他们在客户端与 Polaris 之间使用单独的失效事件流。这个流专门用于传递缓存失效事件,即使在网络分区的情况下,也能确保失效事件被传递到位。

解决缓存不一致的一个简单方法是查询数据库。但大规模下数据库存在过载风险。因此 Polaris 以 1、5 或 10 分钟为时间间隔查询数据库。通过这种方式,Polaris 可以在确保数据一致性的同时,避免频繁查询数据库导致的过载问题。

2. 追踪

在没有日志的情况下调试分布式缓存中的问题非常困难。为了找到缓存不一致的原因,记录每个数据更改虽然是一个办法,但因为写入操作过于频繁,导致这种方法不可扩展。因此,他们创建了一个跟踪库并将其嵌入到每个缓存服务器上。
在这里插入图片描述

其工作原理如下:

  • 跟踪库仅记录在竞争条件时间窗口内发生的数据变化,从而减少了日志存储的需求。竞争条件时间窗口是指在发生数据竞争的时间段。例如,当多个操作同时尝试访问和修改同一数据时,会产生竞争条件。
  • 跟踪库会保存最近修改的数据的索引,以便在发生新的数据更改时,判断是否需要记录。如果新数据变更涉及到最近修改的数据,才会进行记录。这种方式减少了不必要的日志记录,
  • 如果Polaris发现缓存不一致,它会读取这些日志来查找问题的根源,然后发送通知。这样可以快速定位和解决问题。

缓存失效是计算机科学中的难题之一,现在 Meta 支持 10 个 9 的缓存一致性 - 99.99999999%。简而言之,100 亿次缓存写入中,只有 1 次会出现不一致的情况。这种技术可以与任何规模的缓存服务器一起使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 整合 Redis 实现验证码登录功能

一、整合Redis 在pom.xml中添加Redis相关依赖&#xff1b; <!--Spring Data Redis依赖配置--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>…

阿里云账户注册与实名认证详细教程

在开始使用阿里云服务之前&#xff0c;您需要先有一个阿里云账号&#xff0c;拥有阿里云账号后&#xff0c;您可以选购和使用云产品和服务。如果您没有阿里云账号&#xff0c;需要先注册一个阿里云账号。 说明 一个手机号码下最多可以注册6个阿里云账号。如果您的手机号码已经…

一分钟了解VMware虚拟机三种网络模式区别

VMware虚拟机提供了三种主要的网络模式&#xff0c;分别是桥接模式&#xff08;Bridged Mode&#xff09;、网络地址转换模式&#xff08;NAT Mode&#xff09;和仅主机模式&#xff08;Host-Only Mode&#xff09;。这三种模式各有其特点和适用场景&#xff0c;以下是对它们之…

Perfectly Clear WorkBench中文绿色版,让每一张照片都完美无瑕

软件简介 你是否曾经为了一张不完美的照片而感到遗憾&#xff1f;是否曾经因为照片中的小瑕疵而不得不花费大量时间进行后期处理&#xff1f;现在&#xff0c;有了Perfectly Clear WorkBench&#xff0c;这些问题都将迎刃而解。作为全球领先的智能图像校正技术商推出的图像清晰…

jvm实战

一、查看JVM内存使用状况 jps 查看本地正在运行的java进程和进程ID(pid) win10报jps不是内部或外部命令,也不是可运行的程序或批处理文件解决?将用户变量和系统变量的Path都追加2个bin。 jinfo jinfo pid 查看指定pid的所有JVM信息jinfo -flags pid 查询虚拟机运行参数…

低代码开发平台:加速企业数字化转型的利器

前言 在软件开发领域&#xff0c;传统的编码方式往往复杂且耗时&#xff0c;对技术团队的技能要求高。随着企业数字化转型的加速&#xff0c;低代码开发平台作为一种新兴的解决方案&#xff0c;逐渐成为许多组织提升开发效率、降低技术门槛的利器。本文将深入探讨低代码开发的…

【Drools】(三)基于业务数据动态调用 DRL 规则文件:详细实现与测试指南

基于业务数据动态调用 DRL 规则文件&#xff1a;详解与实战 在业务规则管理中&#xff0c;DRL 文件&#xff08;Drools Rule Language 文件&#xff09;用于定义和执行业务规则。通过动态调用 DRL 文件&#xff0c;我们可以根据不同的业务场景灵活配置和执行定制化的规则&…

【中项】系统集成项目管理工程师-第8章 信息安全工程-8.3工程体系架构

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

MongoDB 基础知识

一、为什么学习MongoDB MongoDB解决Mysql 的“三高”问题&#xff1a; 1.对数据库高并发写入需求 2.对海量数据高效率存储访问需求 3.对数据库高扩展和高可用的需求 MongoDB 实际应用&#xff1a; 1.社交场景&#xff0c;比如朋友圈&#xff0c;附近的人的地点的存储 2.…

Python for循环迭代原理(迭代器 Iterator)

在使用Python时&#xff0c;我们经常会使用for循环来访问容器对象&#xff08;列表、字符、字典等&#xff09;中的元素。其幕后实际是通过迭代协议来完成的&#xff0c;迭代是一种依次访问对象中元素的方式&#xff0c;for循环在对象上调用iter()函数生成一个迭代器&#xff0…

【Docker】Namespace 空间隔离实战

一、实战目的 了解隔离能力并不是 Docker 提供的&#xff0c;而是操作系统内核提供基本能力。 二、基础知识 1、dd 命令详解 Linux dd 命令用于读取、转换并输出数据。 dd 可从标准输入或文件中读取数据&#xff0c;根据指定的格式来转换数据&#xff0c;再输出到文件、…

Vue3----扩展 element Plug card

扩展 element Plug card 增加全屏&#xff0c;折叠操作项 核心代码 <template><div class"cc-card-component"><el-card v-if"state.isShow" :class"state.class" :bodyStyle"bodyStyle" :shadow"props.shadow…

Vmwar保姆级安装与配置

文章目录 一、官方下载1.访问VMware官方网站&#xff1a;2.选择产品&#xff1a;3.下载安装包&#xff1a; 二、VMware的安装1.运行安装程序2.选择安装位置3.选择安装选项4.完成安装 三、启动VMware Workstation Pro并配置虚拟机1.创建新的虚拟机&#xff1a;2.配置虚拟机硬件 …

【C#】.net core 6.0 webapi 使用core版本的NPOI的Excel读取数据以及保存数据

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景读取并保存NPOI信息NPOI 插件介绍基本功能示例代码写入 Excel 文件…

前端JavaScript处理小数精度问题(最佳实践)

前言&#xff1a; 针对于小数精度问题&#xff0c;本次我们主要推荐两种方式&#xff0c;一种是简单的函数封装&#xff0c;一种是使用第三方库big.js。 方法一&#xff1a; 自封装函数搭配parseFloat和toFixed解决小数精度问题&#xff0c;仅适用于解决一般性小数精度问题&…

【云原生】Kubernetes----k8s免密使用harbor私有仓库

目录 引言 一、搭建Harbor仓库 &#xff08;一&#xff09;关闭防护 &#xff08;二&#xff09;安装docker &#xff08;三&#xff09;安装docker-compose &#xff08;四&#xff09;安装harbor-offline 1.获取安装包 2.修改配置文件 3.启动服务 4.登录仓库验证 二…

营销人看巴黎奥运会,看到了什么?

不同的人眼中的巴黎奥运会是不一样的&#xff1a;环保人士关注奥运场馆的绿色设计&#xff0c;以及赛事期间对可再生能源的利用&#xff1b;旅游博主用镜头捕捉巴黎奥运会每一个精彩瞬间&#xff1b;社会学家在巴黎奥运会看到多元文化的交流与融合…… 那么营销人在巴黎奥运会…

聚观早报 | OPPO Find X8系列电池曝光;小米15 Pro更多影像细节

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 7月30日消息 OPPO Find X8系列电池曝光 小米15 Pro更多影像细节 KeeTa平台已开放便利店入驻 比亚迪方程豹将扩大…

大模型面试之LoRA

LoRA的解释&#xff1a;一种高效微调预训练神经网络的方法 LoRA 解决的问题&#xff1a; &#x1f538; 2021年初&#xff0c;微软与OpenAI合作探索GPT-3的商业可行性。 &#x1f538; 发现仅仅通过提示&#xff08;prompting&#xff09;不足以完成生产任务&#xff0c;例如…

EfficientNet-v2-s图像分类训练(简洁版)

使用torchvision集成的efficientnet-v2-s模型&#xff0c;调用torchvision库中的Oxford IIIT Pet数据集&#xff0c;对模型进行训练。 若有修改要求&#xff0c;可以修改以下部分&#xff1a; train_dataset OxfordIIITPet(root./data, splittrainval, downloadTrue, transfo…