1、问题抽象:并发读、并发写、稳准快
2、4要1不要:数据要尽量少、请求数要尽量少、路径要尽量短、依赖要尽量少(服务分级)、不要有单点
3、秒杀思路:秒杀系统独立部署、热点数据进缓存、答题环节、动静分离、本地缓存、限流
4、动静分离
1)做法:
a、把静态数据缓存到离用户最近的地方:浏览器、CDN、服务端Cache
b、静态化改造,直接缓存HTTP连接
c、代理层缓存
2)动静分离架构方案
a、实体机单机部署
b、统一Cache层
c、上CDN
5、热点数据&&热点操作
1)发现静态热点数据(能提前预测):活动标识、大数据
2)发现动态热点数据(不能提前预测):日志聚合分析回写
3)处理热点数据:优化(缓存)、限制(分桶)、隔离(业务隔离->活动,系统隔离->独立部署,数据隔离->单独cache、db)
6、削峰:
1)排队:消息队列
2)答题:增加复杂度,从而防秒杀器、延缓请求
3)分层过滤:CDN、前台读系统、后台写系统、DB
4)业务活动引流
7、性能:QPS
1)RT:减少CPU的执行时间
a、发现瓶颈:jstack、jprofiler、yourkit
b、解决方式:减少编码、减少序列化、Java极致优化、并发读优化(集中Cache->LocalCache)
2)线程数:增加线程数,会增加切换,数量需考虑均衡
8、减库存
1)方案:
a、下单减库存:恶意下单问题
b、付款减库存:库存超卖问题
c、预扣库存
2)防止恶意下单:恶意用户标识、限制购买数量
3)减库存处理
a、Cache中减库存
b、数据库中减库存:incr where 库存>0
c、并发锁问题:应用层排队、数据库层排队
9、降级、限流、熔断
10、缓存失效:
1)被动失效:过期时间
2)主动失效:改库删缓存、失效中心监控数据表binlog来删缓存
参考:https://time.geekbang.org/column/intro/127