Wow4j Wow4j
首页
个人使用说明书
后端开发
前端开发
测试开发
运维开发
大数据开发
产品&UI交互
团队管理
软技能
他山之石
开源产品
敬请期待
GitHub (opens new window)
首页
个人使用说明书
后端开发
前端开发
测试开发
运维开发
大数据开发
产品&UI交互
团队管理
软技能
他山之石
开源产品
敬请期待
GitHub (opens new window)
  • 他山之石
  • 后端&架构

    • 23讲搞定后台架构实战

      • 开篇词 跳出单点思维模式,才能真正理解架构设计
      • 为什么不同类型的业务后台架构模式是通用的?
      • 如何利用“拆分”降低架构复杂度?
      • 如何使用简洁的架构实现高性能读服务?
      • 如何利用全量缓存打造毫秒级的读服务?
      • 如何做到异构数据的同步一致性?
      • 如何应对热点数据的查询?
      • 如何基于流量回放实现读服务的自动化测试回归?
      • 如何使用分库分表支持海量数据的写入?
      • 如何打造无状态的存储实现随时切库的写入服务?
      • 如何利用依赖管控来提升写服务的性能和可用性?
      • 分库分表化后如何满足多维度查询?
      • 如何利用数据库实现并发扣减?
      • 如何利用缓存实现万级并发扣减?
      • 如何利用缓存+数据库构建高可靠的扣减方案?
      • 数据库与缓存的扩展升级与扣减返还
      • 秒杀场景:热点扣减如何保证命中的存储分片不挂?
      • 如何设计一锤子买卖的 SDK ?
      • 如何设计微服务才能防止宕机?
      • 如何做好微服务间依赖的治理和分布式事务?
      • 如何通过监控快速发现问题?
      • 如何进行高保真压测和服务扩容?
      • 重构:系统升级,如何实现不停服的数据迁移和用户切量?
      • 重构:烟囱式、平台化、中台化的架构同与异
      • 加餐  技术人如何准备晋升答辩?
      • 结束语  抓住本质,是成为技术专家的不二法则
    • 成为会带团队的技术人

  • 他山之石
  • 后端&架构
  • 23讲搞定后台架构实战
timchen525
2023-02-22

如何利用全量缓存打造毫秒级的读服务?

上一讲我们介绍了一个简单易实现,且成本较低的高性能读服务方案及其升级方案,但其中仍有两个问题暂未完全解决:

  • 第一个问题是为了保证缓存更新实时性而带来的分布式事务的问题;

  • 第二个问题是懒加载导致的毛刺问题。

在本讲里,我将针对上述两个问题,和你一起利用全量缓存打造一个无毛刺、平均性能在 100ms 以内的读服务。

全量缓存的基本架构

全量缓存是指将数据库中的所有数据都存储在缓存中,同时在缓存中不设置过期时间的一种实现方式,此实现的架构如下图 1 所示:

图片1.png

图 1:全量缓存的架构图

因为所有数据都存储在缓存里,读服务在查询时不会再降级到数据库里,所有的请求都完全依赖缓存。此时,因降级到数据库导致的毛刺问题就解决了。

但全量缓存并没有解决更新时的分布式事务问题,反而把问题放大了。因为全量缓存对数据更新要求更加严格,要求所有数据库已有数据和实时更新的数据必须完全同步至缓存,不能有遗漏。

对于此问题,一种有效的方案是采用订阅数据库的 Binlog 实现数据同步。

基于 Binlog 的全量缓存架构

在实施基于 Binlog 的架构方案前,我先简单介绍下 Binlog,更加详细的介绍我将在“05 讲”里和你讨论。首先看下 Binlog 的原理,如下图 2 所示:

图片2.png

图 2:Binlog 原理图

Binlog 是 MySQL 及大部分主流数据库的主从数据同步方案。主数据库会将所有的变更按一定格式写入它本机的 Binlog 文件中。在主从同步时,从数据库会和主数据库建立连接,通过特定的协议串行地读取主数据库的 Binlog 文件,并在从库进行 Binlog 的回放,进而完成主从复制。

现在很多开源工具(如阿里的 Canal、MySQL_Streamer、Maxwell、Linkedin 的 Databus 等)可以模拟主从复制的协议。通过模拟协议读取主数据库的 Binlog 文件,从而获取主库的所有变更。对于这些变更,它们开放了各种接口供业务服务获取数据。

基于 Binlog 的全量缓存架构正是依赖此类中间件完来成数据同步的,架构如下图 3 所示:

图片3.png

图 3:基于 Binlog 的缓存同步架构图

上次更新: 2023/02/22, 16:26:20
如何使用简洁的架构实现高性能读服务?
如何做到异构数据的同步一致性?

← 如何使用简洁的架构实现高性能读服务? 如何做到异构数据的同步一致性?→

Theme by Vdoing | Copyright © 2022-2023 timchen525 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×