vlambda博客
学习文章列表

架构设计 • 多级缓存架构(上)

软件工程师们都知道:在软件系统建设过程中,软件架构的设计是很重要的,今天聊一下关于架构设计的一些知识,主要谈谈缓存架构。

< 为什么需要架构设计 >

一个软件系统的成败,最初的架构设计是十分重要的。然而很多时候发现对于一些规模较小的系统来说,似乎并不需要什么架构设计,叫上几个人,直接开干就是了。等系统上线后,或许这些系统也能"稳定"运行,似乎也没什么不好,那么最开始去花时间做架构设计,是不是浪费时间、多此一举了呢 ?然而 个问 经过仔细思考,便知 其实不 然。

当构建一个较大规模系统,就像盖一幢高楼大厦,如果最初没有设计 好系统架构,直接进入开发阶段,那么整个实施过程就像是 不为大厦做房梁整体框架的搭建,直接堆板砖一样,等房子建成后,才发现坍塌的可能性非常之大,甚至建设一半、少一半就会发现建不下去了,到那时才发现最初房梁框架设计、搭建是多么重要。若事已至此,悔之晚矣,只能“默无语两眼泪,耳边响起驼铃声了”...

最终才知 道:只有 良好 架构 设计的房子才 能够经 受风雨, 屹立不倒 !

架构设计 • 多级缓存架构(上)


软件建设亦是如此,开始研发之前做好架 构设计,与盖大厦有异曲同工之作用。 最初的设计好了,对整个系统的实施来说会事半功倍,对后期系统的稳定性、可靠性都是保证。甚至可以在架构设计阶段规避一些可预见的风险,初步的评估出该项目的落地可行性,如果一开始就发现是不靠谱的架构,那就可以即时止损,节约成本,重新迭代,再做设计,而非直接开干了。如此,软件系统的实施过程将会变的很顺畅,就像是在设计优美的跑道上奔跑一样。

有的系统过于庞大、复杂,开始时根本没法设计出完整的架构,那么此时应该将系统分阶段建设,架构也分阶段设计。保证每个阶段架构的成功,最终实现整体系统架构的落地。值得说明的是每个人对架构设计的理解不同,没有谁是绝对的对与错,不同行业、场景所应对的架构并不相同,能良好的满足需求的架构就是最好的,设计不足、过度设计都是不可取的。架构设计门道很多,故而对架构设计的理解需要大家相互分享、共同学习,在这个过程中,人人都是老师,人人又都是学生。

上边说了这么多,其实就是说明一点:为什么需要做架构设计。原因千言万语,这里不再多叙,关于这个“为什么”的问题,今天咱们先聊到这里,接下来主要谈谈多级缓存架构。

< 多级缓存架构 >

在传统IT时代,所谓的多级缓存架构并没有这么盛行。那时候说起基本缓存使用,大部分的工程师都知道,但对于多级缓存架构来说,却鲜为人知。伴随着互联网时代的来临,软件系统用户数的迅速增长,使得用户请求数量成倍增加,出现高并发、高可用、可扩展、可安全的架构要求,是一个必然。

就应对高并发来讲,缓存的运用可以说是软件架构中最重要的一类解决方案,或者说最为关键的技术。提到缓存,可能大家一想到的就是Redis / MemoryCache...,然而缓存其实并非是一项单一的技术框架,它是一个完整的体系。在系统的不同环节,有不同的缓存产品应用,这便是所谓的多级缓存。让我们通过下图,一图搞清楚成名已久的多级缓存架构到底是个什么样子,直接上图:

架构设计 • 多级缓存架构(上)


单纯看图,似乎有些凌乱,下面我们遵照这幅图一级一级的来谈一下各级缓存是什么、它的作用,以及整个多级缓存架构的含义。

值得一说的是,缓存分级后,从靠近用户的这一端开始数起,这是优先级最高的,也固称其为第一级缓存,以此往后数为第二级缓存、第三级缓存...,用户请求是按着这个顺序来获取资源的。再大白话一点说,就是:一级缓存中找到了数据,就不再去二级缓存找了,二级缓存中找到了,就不再去三级缓存中找了...以此类推。

开始谈缓存之前,先说一下一个用户请求获取数据的流程,从用户的使用开始说起,当我们在手机上使用一个APP,或者在电脑上打开浏览器输入某个网址回车后,都会向后端系统发起一个请求,通过这个请求,去加载所需要的资源(文字、图片、音频、视频等)。这些资源通常都存在各类数据库、索引库、NoSQL库、文件系统中,当请求到达时,由程序从这些仓库中获取数据,并将数据返回给用户,这是一个简化的、最基本的数据请求流程。

第一级缓存:浏览器级别缓存

在用户第一次请求资源时,就会执行刚才谈到的那个获取数据的流程。但是用户第二次再去发起同样的请求时,有些数据资源,手机APP或浏览器不会再去后台获取,而是直接从它们的缓存中获取。那么为什么缓存中会有这些资源呢?是因为在第一次请求时,这些资源不仅给了用户,同时浏览器或手机APP也悄悄的将其保存了一份到它们各自的缓存当中,所以当再一次发起请求时,缓存中已经有了这些资源,直接从缓存中获取资源返回给用户,这样就省掉了后边去各种库里边取数据的过程,提升了系统响应的速度,这便是第一级缓存及它的作用。

第二级缓存:CDN缓存

要弄清楚CDN缓存,先要搞清楚什么是CDN,下面先来普及 一下CDN的概念:CDN 的全称为 Content Delivery Network,叫做内容分发网络。 大家知道我国幅员辽阔,网络环境也是很复杂的,如果在南方的某地访问北方某地的应用系统,由于传输数据量大、传输距离远,所以会导致系统访问变慢,用户使用体验变差。 而CDN要做的事就是 ,在用户访问前就将变化很小的静态资源 分发到全国各地 网络服务提供商的机房 中, 例如: 北京的静态资源分发到北京机房, 上海的 静态资源分发到上海机房, 南昌的 静态资源分发到南昌机房

这样做有什么好处呢?这样做可以大大的缩小静态资源的获取距离,从而提升系统响应速度,达到资源访问加速的目的。如果你在北京访问系统时,加载的静态资源来源于北京机房,在上海访问时,加载的静态资源来源于上海机房,在南昌访问时,加载的静态资源来源于南昌机房,这样一来,就解决了由于传输距离远而导致的资源传输效率低下的问题了。

架构设计 • 多级缓存架构(上)


纵观CDN的整个流程,请思考一下,它所提供的静态资源是实时从中心机房获取的吗?当然 不是的,而这不恰恰就是一个缓存吗,没错,这便是CDN缓存。如果系统做了CDN加速后,那么它就是整个多级缓存架构中的第二级缓存。当我们用手机或电脑浏览器访问某系统时,如果一级缓存中尚无数据,而此时如果CDN中已有相应的静态资源数据,那么这部分数据便会从CDN中获取,而不会去中央服务器上获取了。可以看到,CDN缓存是排在浏览器级别缓存后的,又一级缓存,这便是第二级缓存及它的作用。

说明: 由于多级缓存架构内容较多,分为上、下两篇进行介绍,该篇为上篇,后续会发出下篇,敬请关注,谢谢。

青山不改,绿水长流,如果你感兴趣更多知识分享,"Talking Java" 中见  架构设计 • 多级缓存架构(上)