如何抗住单页10w的qps?
一 什么是静态数据与动态数据?
静态数据是”无个性化”数据
- 静态文件: HTML/CSS/JS/图片
- 低频变动数据: 字典数据 / 地区数据 / 组织架构 / 历史数据
动态数据就是个性化/高频写数据:
- 个性化推荐
- 高频写: 股市行情 / 5G信号数据 / 天气变化
有效区分页面中的动静数据是优化的关键前提。
如上图:
我们如何分析?
可以明确的划分,左侧商品信息,图片,商品标题,右侧下方商品的sku信息,在短期内都是不会变化的。
然后商品的价格,他不一定是固定的值,大数据杀熟的话,可能每个人看到的数据都是不同的,活动信息,赠品信息可能都随着时间变化而变化,明显就是动态数据。
二 动静分离
上图是一个很常规的动静分离的流程图:
- 静态数据资源通过CDN做缓存
- 动态数据从后台更新而来
- freemaker虽然在业界使用比较多,但是其生成动态页面也需要几百毫秒
那么问题来了,怎么把动态页面生成到静态页?
一般解决的方法有两种:
- 页面静态化技术
将动态页面”另存为”静态页面保存到本地磁盘
利用Nginx直接路由到磁盘文件,不再进入后端
文件碎片化严重,文件同步管理麻烦
- 页面伪静态化技术(推荐)
利用Redis缓存,缓存生成的页面
没有碎片化问题,可自动过期,数据管理轻松
需要大量内存存储信息
我们来看一下伪静态化是怎么实现的:
但是一个页面不可能全是静态化的数据:
那么有没有其他的动静分离方案呢?
- 服务端SSI法
利用Nginx SSI特性实现服务端动静整合:
我们来看一下京东的解决方案:
- 我们可以看到表头是包含了静态页面和动态页面的
- 静态页面直接加载即可
- 动态页面我们采用dynamic这个前缀来指定
- 当系统加载的时候,我们判断此页面是动态页面
- 就通过nginx里边的lua脚本,通过对应的参数,去请求对应的伪静态化页面
- 没有缓存即从应用系统查询
- Ajax异步调用法
生成静态页面,动态数据部分发起Ajax异步查询: