静态页面生成是经常使用的提高性能手段,将一些高并发、变化频率低、对延迟容忍度高的页面生为静态页面,在电商场景中首页、商品详情页、帮助中心页、专题页都是符合特征的页面。经过生成静态页直接输出给浏览器,可以有效的减小数据库及cpu的负载。html
前端
整体分为三大类:页面的生成,页面的存储和页面的读取,其难点分析以下:vue
java
页面生成难点node
nginx
页面的生成方案多是多样的,主要是看是否采用了先后端分离的设计,若是采用了先后端分离,若是直接使用前端框架的源码会存在seo失效的问题,由于数据是rest api返回的,前端框架o(如vue)须要将这些数据在浏览器中渲染后才会造成用户能看到的效果,而对于seo的爬虫来说,他不会执行vue的渲染过程,因此seo爬虫看到的是没有数据填充的html代码,致使seo几无效。redis
在javashop电商系统的7.0版本中已经采用了先后端分离技术,相应的解决方案是采用nodejs的服务器端渲染,网页生成装置经过httpclient先去nodejs服务中抓取vue渲染过的html(已经填充好数据 了),再存入存储装置。数据库
在javashop电商系统的6.x版本中没有先后端分离技术,页面生成是经过freemarker解析模板来生成的,没有seo问题,这和常见的生成没有什么区别,在这里再也不赘述。后端
2、页面同步api
当页面内容发生变化时,相应的页面生成装置要被触发,javashop电商系统中在相应业务中有比较齐全的异步消息发送,好比商品信息的变动,首页楼层的变化等(javashop使用的是rabbitmq),在页面生成模块中对这些消息作了响应,触发相应的页面生成动做。
在由Redis中读取时,能够选择经过java读取经过tomcat等输出给浏览器,这种方式大可能是要再由nginx等代理输出,中间层较多,对于并发优化,参数调优要求也就太高。
javashop电商系统中采用nginx+lua脚本直接读取redis并输出的方案,这样减小了中间层,还能够在Nginx中作本地缓存提升性能。
在电商场景中,商品详细页面中库存数据是有时时性要求的,且是高并发的。javashop在商品详细静态页中会经过异步请求库存api来时时获取库存,为了提供较高的并发能力,库存是存储在redis中的。
页面中其它时时数据,如会话状态、购物车bar等均可以经过此方案来解决。
固然在不一样的业务场景下实现的方案是多种多样的,仅以此方案抛砖引玉,供你们参考。
易族智汇(javashop)原创文章