构建大型网站学习笔记
参考:构建需求响应式亿级商品详情页
原子数据存储
数据异构集群数据同步MQ
商品信息聚合集群\商品介绍聚合集群\其他Redis集群
多维度划分
基本信息:标题/图片/颜色尺码/规格参数/特殊属性/扩展属性
商品介绍:商家模板/商品介绍
非商品维度:分类信息/商家信息/店铺信息/品牌信息
其他维度:价格/促销/配送至/广告词
拆分系统
多个子系统,底层存储的是原子数据,上层子系统按照不同维度对外提供服务,如商品详情/商品介绍,减少相互影响
Worker无状态化+任务化
应用无状态,但配置文件有状态,如每个机房一套配置等。
任务有多种队列:等待队列/排重队列/本地执行队列/失败队列/高优先级队列
副本队列:失败时可以重放,比如按照固定大小或者小时队列设计
消息设计按照维度更新,减少每次变更接口的调用量。如:信息变更和商品上下架消息。
异步化+并发化
利用消息通知,进行异步化,改善同步推送机制
数据更新异步化:同步调用服务,异步更新数据
可并行任务并发化:如聚合多维度数据
异步请求合并:一次请求拿到所有数据,请求排重
多级缓存化
浏览器缓存:页面之间跳转走缓存,打开刷新页面检测缓存是否过期,减少来回传输的数据
CDN缓存
服务端应用本地缓存: reload不丢失,内存级Proxy Cache, 做负载均衡内部对URL重写
读缓存策略:根据不同维度,数据量大的,30KB以上,缓存半个小时没什么问题。
服务端分布式缓存:内存+Redis+SSD
动态化
数据获取动态化:按维度获取数据,根据属性做业务逻辑,支持随时变更模板需求,重启应用秒级化。
弹性化
接入Docker,制作基础镜像,需要的软件打成镜像,自动扩容
降级开关
推送降级开关,开关集中维护
如前端数据集群-数据异构集群-动态服务;前面坏了,可以从后面的一级,获取数据进行修复。
开关前置化:在Nginx上做开关,请求就到不了后端
可降级的业务线程池隔离:请求-Tomcat线程池-请求解析-请求队列-不同业务线程池-业务处理-产生响应
多机房多活
应用无状态,配置文件有状态
一主三从结构,防止机房挂了,产生抖动
多种压测方案
线下测试:ab测试,Jmeter测试
线上测试:Tcpcopy,把线上流量导入压测服务器
Nginx接入层线上灰度引流
接入层转发时只保留有用请求头
使用不需要cookie的无状态域名,减少入口带宽
Nginx Proxy Cache只缓存有效数据,如托底数据不缓存
使用非阻塞锁应对local cache失效时突发请求到后端应用(lua-resty-lock/proxy_cache_lock)
使用Twemproxy减少Redis连接数
使用unix domain socket套接字减少本机TCP连接数
设置合理的超时时间(连接,读,写)
使用长连接减少内部服务的连接数
去数据库依赖(内部使用机房域名而不是ip),服务化
客户端同域连接限制,进行域名区分