佳构原创技能分享,知识的组装工

目录序言方案一:网页静态HTML化伪静态布局样式模板化运用层nginx分发层nginx序言

我们小伙伴们在访问淘宝、网易等大型网站时有没有考虑到,网站首页、商品详情页以及新闻详情页面是如何处理的?怎么能够支撑这么大流量的访问呢?

很多小伙伴们就会提出他们都采取了静态化的方案,这样用户要求直接获取静态数据html,就不须要访问数据库了,性能就会大大提高;而且提高网站SEO优化。
那本日老顾就带着大家聊一下静态化。
把老顾之前事情场景中静态化方案碰着的问题,以及如何演化的,分享给小伙伴。

html是伪静态吗你懂得年夜型网站的页面静态化吗 jQuery

关于干系的静态文件的CDN技能,老顾就不在这边讲了。
这个大型网站肯定都会用到的,什么是CDN,小伙伴们可以在网上查询看一下,比较大略;我们这边看重看技能方案。

方案一:网页静态HTML化

这个方案是老顾最早利用的方案,我们就拿CMS系统举例,类似网易的新闻网站;核心流程图

上图的核心思想:

1)管理后台调用新闻做事创建文章成功后,发送到行列步队

2)静态做事监听,把文章静态化,也便是天生html文件

3)在静态做事器上面安装一个文件同步工具,此工具的功能可以做到只同步有变动的文件,即做增量同步(老顾用久没用了,忘了工具的名称)

4)通过同步工具把html文件同步到所有的web做事器上面

这样的话就达到了,用户访问一些变革不大的页面时,是直接访问的html文件,直接在web做事器那边直接返回,不须要在访问数据库了,系统吞吐量比较高。

这个方案的问题:

1、网页布局样式僵化,无法修正

如果产品经理以为新闻详情页面的布局要调度一下,现在的不足都雅,或者加个其他模块,那就坑爹了,我们须要把所有的已经静态html化的文章全部重新静态化。
这个是不现实的,由于像网易这么大的体量,新闻量是很大的,会被搞去世。

2、页面会涌现暂时间不一致

会涌现用户刚刚再看最新的新闻,刷新一下又不存在了。
这个是由于同步工具在同步到web做事器是要有韶光的,同步到web做事器A上面了,但web做事器B还没有来得及同步。
用户在访问的时候通过nginx进行负载均衡,随机把要求分配给web做事器的导致的。
当然可以调度nginx负载均衡策略去办理。

3、Html文件太多,无法掩护

这个是很明显的问题,html文件会越来越多,对存储空间哀求很大,而且每台web做事器都一样,摧残浪费蹂躏磁盘空间;将来迁移掩护也会带来很大的麻烦。

4、同步工具的不稳定

由于文件一旦多之后,同步工具稳定性就涌现了问题

这个方案该当是比较传统的(不推举)

方案二:伪静态化

什么是伪静态?

举个例子:我们一样平常访问一个文章,一样平常的链接地址为:http://www.xxx.com/news?id=1代表要求id为1的文章。
不过这种链接办法对SEO不是太友好(SEO对网站来说太主要了);以是一样平常进行改造:http://www.xxx.com/news/1.html 这样看上去便是个静态页面。
一样平常我们可以采取nginx对url进行rewrite。
小伙伴如何有兴趣可以自行理解,比较大略。

之所以是伪静态实在也是须要动态处理的。

针对方案一上面问题,方案进一步的蜕变,如下图

此方案的核心思想

1)管理后台调用新闻做事创建文章成功后,发送到行列步队

2)缓存做事监听,把文章内容缓存到缓存做事器上面

3)用户发起要求,web做事器根据id,直接查询缓存做事器

4)获取数据返回给用户

此方案就办理了方案一的一个大问题,便是html文件多的问题,由于不须要天生html,而且用缓存的办法,办理不须要访问数据库,提升系统吞吐量。

不过此方案的问题:

1、网页布局样式掩护本钱比较高,由于此方案还是是把所有的内容放到了缓存中,如果须要修正布局,须要重新设置缓存。

2、分布式缓存压力比较大,一旦缓存故障就导致所有要求会查询数据库,导致系统崩溃

还有个小问题,便是实时数据处理,便是页面中如价格,库存须要到后台读取的。
当然小伙伴大概就会说,也可以处理啊,用户把商品内容要求到后,然后在用浏览器发送异步的ajax要求得到商品数量就好了啊。
这样便是无形的增加了一次要求。
(此问题可以忽略)

此方案类似很多公司都在利用,如:同程旅游等

方案三:布局样式模板化

针对方案二的问题,我们可以采取openresty技能方案进行,利用http模板插件lua脚本进行办理,这里老顾不会先容openresty+lua技能,有兴趣的小伙伴,可以到访问https://www.roncoo.com/view/139 这个视频课程。

如下图:

这里解释一下上图中我们小伙伴不须要全部都要理解,这个是比较全的商品详情页的办理方案,涉及到了三级缓存这个观点,在这里老顾就不深入讲三级缓存了。

我们紧张看的是上面怎么会有两层ngnix,分发层和运用层,这个是什么意思?

运用层nginx

老顾先先容一下运用层nginx是什么意思?nginx一样平常被用做负载均衡,实在nginx还有很多的功能,尤其他的openresty扩展 + lua脚本措辞结合起来可以完成很多功能,小伙伴可以理解为lua脚本措辞便是类似java措辞,可以动态处理业务,如:本地缓存处理,远程http访问,访问redis等。

运用层nginx便是利用了http模板 + 缓存通过lua脚本完成的网页渲染

http模板

1)运用层nginx通过lua脚本措辞先获取本地商品数据,然后和http模板进行渲染,形成终极商品详情页返回给用户

2)如果运用层nginx本地的缓存没有此商品数据,就通过lua脚本发起http要求访问web做事器,获取商品数据。

3)web做事器会向redis或本机的ehcache要求商品数据(这里涉及三级缓存观点),如果存在此商品数据,直接返回给用户;如果不存在则要求微做事访问数据库

这个思路便是通过http模板,办理了方案二中的布局样式的问题,如果须要调度布局,只要改一下模板就行了,非常方便。
也办理了实时性问题。
这边涉及到的nginx本地缓存实在便是为了担保不须要访问数据库,提升系统吞吐量。
小伙伴只要理解一下思路,如果不理解openresty和lua可以自行上网理解,也可以联系老顾。

分发层ngnix

为什么上面还有一层分发层呢?这个是由于大型网站的商品数太多了,运用层nginx确当地缓存是有限的,不可能把所有的商品数据缓存在同一个做事器确当地缓存;一台运用层nginx只能缓存部分商品数据,说到这里小伙伴是不是该当就知道为什么了吧?便是利用hash同等性算法,根据商品id路由分发到同一个运用层ngnix做事器。

分发层ngnix的浸染便是hash策略的负载均衡,担保了商品id路由到固定的运用层做事器。

三级缓存担保了系统的稳定性,纵然redis缓存崩溃,还有其他2个缓存保障。

总结:

方案三是比较完全的方案,很多大厂都在利用,能够承受亿级流量,但系统比较繁芜。
如果对实时性哀求不高,布局样式调度不频繁,可以考虑方案二,系统比较大略

-End-

如有收成,请帮忙转发,您的鼓励是作者最大的动力,感激!

10几年的履历实战分享

干系微做事,分布式,高并发,高可用,企业实战,干货等原创文章正在路上

欢迎关注头条号:老顾聊技能

佳构原创技能分享,知识的组装工

推举阅读

1、你知道如何保障生产端100%投递成功吗?

2、你知道如何更新缓存吗?如何担保缓存和数据库双写同等性?

3、你知道怎么办理DB读写分离,导致数据不一致问题吗?

4、DB读写分离情形下,如何办理缓存和数据库不一致性问题?

5、你真的知道怎么利用缓存吗?

6、如何利用锁,防止缓存击穿?重构思想的主要性

7、海量订单产生的业务高峰期,如何避免的重复消费?