知道了我们应该在有限资源下进行架构优化,那么我们先思考一个问题。
用户参加秒杀活动的时候,是如何操作系统的呢?
就拿双十一抢购来说,在00:00的时候就是秒杀的时候,那么很多用户会提前几分钟把手机打开到对应的页面,没到时间就开始不停的刷新页面,等待秒杀开始那一刻的到来。
那么小伙伴们有没有考虑过,这些要刷新的页面都是从哪里来的呢?
我们的页面其实也是要有自己专门的订单页面服务器的,主要用于提供前端的访问页面,基本结构如下图:
所以,首先接受高并发请求的系统是前端页面系统。
大家思考一个问题,如果平时不是秒杀的时候,用户看的商品可能都是不同的,但是一旦有秒杀活动,可能有大量的用户一起不停的刷新同一个商品的同一个页面,对系统造成压力。
那么对于这个问题,我们应该怎么解决呢?
王子今天介绍的解决方案就是页面数据的静态化+多级缓存的策略。
页面数据静态化
我们先来聊一聊什么是页面数据的动态化。
假设我们的前端页面是动态化的,那么用户每次访问页面,都会向页面系统发送请求获取数据,然后前端页面根据获取的数据渲染页面,一般来说系统的演进都是从这种动态化开始的,比如jsp页面。
那么如何实现页面的静态化呢,其实就是改变页面获取数据的方式,每次获取数据不再是通过页面系统查询数据库而是从别的地方获取数据,避免每次都去访问后端数据库,对系统造成压力。
多级缓存
了解的静态化的思想,那么我们再来看看多级缓存是什么,我们要聊的多级缓存指的是CDN+Nginx+Redis的多级缓存架构。
什么意思呢?就是说页面的数据首先放一份到离用户最近的CDN上边。
可能有的小伙伴不理解CDN,王子给大家简单扫一下盲。
比如我们的系统服务器部署在北京,访问我们系统的用户在海南,那么它每次访问我们系统是要到我们北京的服务器上面获取数据吗?
不是的,我们是可以把静态化的页面数据部署到海南的CDN上边去的,而海南的用户就可以通过CDN获取到我们系统的页面数据。
这个CDN都是各种云厂商提供的服务,它就是我们架构中的第一级缓存。
如果由于CDN中缓存过期等原因,导致没有从CDN中得到页面数据,那么此时用户就会将这个请求发送到我们北京的服务器上边,但是这个时候系统不是直接查询数据库返回数据的,而是先访问Nginx服务器上的缓存。
Nginx是可以基于Lua脚本实现本地缓存的,我们可以提前吧页面数据放到Nginx缓存中,作为第二级的缓存。
如果Nginx上边也没有想要的数据呢?
那么此时可以通过Nginx上的lua脚本发送请求到Redis集群中加载数据,Redis集群就作为我们多级缓存架构的第三级缓存。
如果在Redis集群中还是没有找到数据,我们再去从数据库加载出来,并更新到缓存里。
通过这样一套多级缓存的架构,我们就可以实现页面的静态化数据的存储(数据可能就是一段json串),这样对于我们的页面服务器本身压力就非常的小了。
架构图如下: