秒杀系统设计
2020-03-31 08:34:18 190 举报
AI智能生成
如何设计一个秒杀系统
作者其他创作
大纲/内容
一致性
减库存方式
下单减库存
在应用程序中通过事务来判断,即保证减后库存不能为负数,否则就回滚
直接设置数据库的字段数据为无符号整数,这样减后库存字段值小于零时会直接执行 SQL 语句来报错
使用 CASE WHEN 判断语句
付款减库存
预扣库存
优化
缓存中减库存
适合缓存逻辑单一场景
数据库中减库存
并发锁问题
应用层排队
数据库层排队
高可用
高可用系统建设
架构阶段
异地容灾
异步化
分组隔离
避免单点
编码阶段
限流保护
超时处理
异步线程
错误捕获
测试阶段
beta测试
自动化对比测试
发布阶段
分批发布
多版本发布
运行阶段
数据对账
自动降级
过载保护
实时监控报警
故障发生
故障定位
快速恢复
plan B 兜底
降级
限流
客户端限流
服务端限流
基于 QPS 和线程数的限流
拒绝服务
架构原则
数据要尽量少
请求数据和返回数据少
系统依赖数据少
请求数要尽量少
合并 CSS 和 JavaScript 文件
路径要尽量短
多个相互强依赖的应用合并部署在一起,把远程过程调用(RPC)变成 JVM 内部之间的方法调用
依赖要尽量少
给系统进行分级,防止重要系统被不重要系统拖垮
避免单点
机器配置动态化
应用无状态化
高性能
数据的动静分离
静态数据缓存
把静态数据缓存到离用户最近的地方
统一Cache层
使用CDN二级缓存
失效问题
命中率问题
直接缓存 HTTP 连接
Web层做缓存:Web 服务器(如 Nginx、Apache、Varnish)更擅长处理大并发的静态文件请求
动静分离改造
URL 唯一化
分离浏览者相关的因素
分离时间因素
异步化地域因素
去掉 Cookie
动态内容处理
ESI 方案
CSI 方案
热点数据
定义
静态热点数据
动态热点数据
发现
发现静态热点数据
报名筛选
大数据Top N
发现动态热点数据
处理
优化
缓存热点数据
限制
id一致性hash
隔离
业务隔离
秒杀报名,提前预热
系统隔离
分组部署,单独域名
数据隔离
单独Cache/MySQL
流量削峰
排队
消息队列
线程池加锁等待
FIFO,FILO常用内存排队算法实现
请求序列化到文件,顺序恢复
答题
分层过滤
浏览器层
按钮置灰,禁止重复提交
限制X秒只能提交一次
站点层
相同UUID,限制访问频率
item详情做缓存
服务层
写请求进消息队列
读请求做缓存
数据的二次校验
数据层
强一致性校验
提升性能
性能因素
减少CPU执行时间
合理的并发线程数
发现瓶颈
CPU诊断工具:JProfiler 和 Yourkit
jstack 定时地打印调用栈
优化系统
减少编码
网页输出可以直接进行流输出
Velocity 优化实践
减少序列化
Java极致优化
直接使用 Servlet 处理请求
直接输出流数据
并发读优化
应用层的 LocalCache
0 条评论
下一页