当前位置: 首页 > news >正文

缓存失效竟然可以这么解决?

数据传输提供的数据订阅功能,可以在不影响业务的情况下,实现简单、可靠的缓存失效逻辑。这种缓存失效机制为阿里巴巴多年架构优化沉淀下来的经验,下面我们一起来看数据订阅究竟怎么实现这种机制。

传统缓存失效策略

为了提高业务访问速度,提升业务读并发,很多用户都会在业务架构中引入缓存层。业务所有读请求全部路由到缓存层,通过缓存的内存读取机制大大提升业务读取性能。缓存中的数据不能持久化 ,一旦缓存异常退出,那么内存中的数据就会丢失,所以为了保证数据完整,业务的更新数据会落地到持久化存储中,例如DB。目前云用户的业务架构一般如下图:

在上图中,大家可以看到,用户的更新数据直接持久化到DB, 业务读请求直接请求缓存数据,所以业务需要解决缓存失效问题,即解决因为数据变更导致缓存中的数据失效的问题。 目前业务解决缓存失效问题的解决方法一般是业务实现DB、缓存双写。通过业务双写解决缓存失效,存在如下的问题:

  1. 代码侵入性比较强,需要双写两份存储,任何对DB的数据变更,都需要同时更新缓存,代码层面后期可维护程度不高
  2. 用户请求线程里同步调用缓存,对缓存存在强以来,遇到缓存超时等异常时,没有办法做到有效的重试,遇到异常给用户返回系统错误、操作失败等信息,严重影响用户体验
  3. 用户请求线程里同步完成DB、缓存双写,变更请求链路长,访问延迟大,影响用户体验

RDS数据订阅消费,轻松解决缓存失效

在阿里巴巴内部同样也遇到了缓存失效的问题,随着业务架构得不断调整优化,我们已经沉淀出一套高可靠、极优雅得缓存失效架构。即通过数据传输提供的数据订阅功能,异步获取DB(例如公共云上的RDS)的增量数据,根据增量数据进行缓存失效。具体的架构类似下图:

在这个架构里面,缓存更新流程如下:

  1. 业务完成DB更新后即返回请求
  2. 数据订阅通过日志解析方式实时解析并订阅DB的增量更新数据,当发现DB有数据更新时,将增量数据推送给下游消费者
  3. 下游消费业务一旦接收到增量更新数据,即调用消费线程进行缓存更新

至此完成整个缓存更新过程。

从上面的缓存失效流程,可以看出这种缓存失效机制:

  1. 更新路径短,延迟低: 缓存失效为异步流程,业务更新DB完成后直接返回,不需要关心缓存失效流程,整个更新路径短,更新延迟低
  2. 应用简单可靠:应用无需实现复杂双写逻辑,只需启动异步线程监听增量数据,更新缓存数据即可
  3. 应用更新无性能消耗:因为数据订阅是通过解析DB的增量日志来获取增量数据,获取数据的过程对业务、DB性能无损

原文发布时间为:2016-06-21

本文来自云栖社区合作伙伴“Linux中国”

相关文章:

  • 一个最简单的jQuery插件编写历程
  • 《Android游戏开发详解》一2.10 使用对象
  • 《Python核心编程(第3版)》——2.8 练习
  • 《编译与反编译技术实战 》一 第1章 实践的环境与工具
  • Hadoop创始人Doug Cutting谈未来大数据的技术
  • 《PowerShell V3——SQL Server 2012数据库自动化运维权威指南》——2.16 创建索引...
  • 《嵌入式C编程:PIC单片机和C编程技术与应用》一1.11 兼容性
  • 《CCNA学习指南:Cisco网络设备互连(ICND1)(第4版)》——2.5节点对点通信
  • 《走进SAP(第2版)》——1.2 小结
  • 《HTML5实战》——第2章 创建表单:输入小部件、数据绑定以及数据验证
  • 《Nmap渗透测试指南》—第7章7.9节系统漏洞扫描
  • Firefox OS 模拟器
  • ThinkPHP学习(五)图片验证码
  • 《需求设计:构建用户想要和需要的产品》——1.3 像工程学那样来开发IT应用程序...
  • 《重构:改善既有代码的设计》—第1章1.2节重构的第一步
  • 自己简单写的 事件订阅机制
  • $translatePartialLoader加载失败及解决方式
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 0x05 Python数据分析,Anaconda八斩刀
  • C++入门教程(10):for 语句
  • extract-text-webpack-plugin用法
  • FineReport中如何实现自动滚屏效果
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JAVA_NIO系列——Channel和Buffer详解
  • Puppeteer:浏览器控制器
  • 浮现式设计
  • 如何利用MongoDB打造TOP榜小程序
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 使用SAX解析XML
  • 数组的操作
  • 携程小程序初体验
  • 一个项目push到多个远程Git仓库
  • Mac 上flink的安装与启动
  • 带你开发类似Pokemon Go的AR游戏
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #QT项目实战(天气预报)
  • (a /b)*c的值
  • (八)Flask之app.route装饰器函数的参数
  • (八)Spring源码解析:Spring MVC
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (转) Face-Resources
  • *上位机的定义
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net Memory Profiler的使用举例
  • .NET MVC第三章、三种传值方式
  • .Net 代码性能 - (1)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .net操作Excel出错解决
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @Responsebody与@RequestBody
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [AIGC] Spring Interceptor 拦截器详解