1、秒杀主要解决2个问题:并发读+并发写
稳、准、快
高性能:设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化
一致性:实现秒杀减库存
高可用:plan B
一、动静分离方案
静态数据缓存
1、把静态数据缓存到离用户最近的地方:CDN
2、静态化改造就是要直接缓存 HTTP 连接
如何做动静分离
1、URL唯一化:比如说商品详情
2、分离浏览者相关因素:判断身份、是否登录、可以单独分离出来,动态获取
3、分离时间因素:服务端时间动态获取
4、异步化地域因素:详情页与地域相关的因素做成异步方式获取
5、去掉Cookie
6、JSON化
获取动态数据方案
1、ESI(edge side includes):
即在 Web 代理服务器上做动态内容请求,并将请求插入到静态页面中、当用户拿到页面时已经是完整的页面,影响服务器性能,用户体验好。
2、CSI(client side includes):
即单独发起一个JavaScript请求,有点延时,体验较差。
动静分离方案
1、实体机单机部署
2、统一Cache层
3、CDN
二、二八原则:有针对的处理热数据
热点:热操作、热数据
热操作:读请求、写请求
热数据:用户热点请求的数据
发现热点数据(普通商品、秒杀商品):
处理热点数据:、优化、限制、隔离
1、业务隔离:秒杀作为一个活动
2、系统隔离:可以用单独的域名、集群
3、数据隔离:单独的cache和MySQL处理
三、流量削峰
1、排队
消息队列缓冲瞬时流量
其它的如:线程池加锁、先进先出,后到先出等内存排队算法、把请求序列化到文件中,再顺序执行(如MySQL binlog的同步机制)来恢复请求
共同特征:一步的操作,变成两步操作
2、答题
1、防止作弊
2、延缓请求
3、分层过滤
分层过滤的核心思想是:在不同的层次尽可能地过滤掉无效请求,让漏斗最末端才是有效的
基本原则
1、缓存数据到web端,过滤无效的数据读
2、对读数据不做强一致性校验,减少一致性校验产生瓶颈的问题
3、对写数据进行基于时间的合理分片,过滤过期的失效请求
4、对写请求做限流保护,将超出系统承载能力的请求过滤掉
5、对写数据进行强一致性校验,只保留最后有效数据
四、性能
1、影响因素:
QT:响应时间:CUP时间+线程等待时间(RPC、IO、Sleep、wait)
QPS:每秒请求数
线程数=2*CPU核数+1
线程数=[(线程等待时间+线程CUP时间)/线程CUP时间]*CUP数量
最好是性能测试发现最佳的线程数
秒杀瓶颈:CPU
优化:
1、减少编码
2、减少序列化
3、Java极致优化
4、并发读优化
性能总结:首先发现短板,其次减少数据、数据分级(确保首屏优先,重要信息优先),减少中间环节
五、减库存
减库存方式:
1、下单减库存
2、支付减库存
3、预扣库存
秒杀减库存的极致优化:秒杀中并不需要对库存有精确的一致性读,把库存数据放到缓存中,可以大大提升读性能
解决并发锁的问题:应用层做排队,数据库层做排队
下单和扣库存两个操作的事务性是怎么做的?
可以分两步来做,先创建订单但是先不生效,然后减库存,如果减库存成功后再生效订单,否则订单不生效
分库分表:提高吞吐量
六、备用方案
1、高可用
系统的高可用涉及:架构阶段、编码阶段、测试阶段、发布阶段、运行阶段、故障阶段
2、降级
当系统的容量到一定的程度时:限制或者关闭系统的某些非核心功能
3、限流
3.1、客户端限流
3.2、服务端限流
4、拒绝服务
七、秒杀系统:应该是一个独立部署的系统,不应该占用其它资源