秒杀系统设计
2021-10-27 14:07:05 0 举报
AI智能生成
秒杀系统设计
作者其他创作
大纲/内容
概括
稳
高可用
兜底-PlanB
降级
限流
客户端限流
服务端限流
基于QPS和线程数的限流
拒绝服务
准
一致性
快
高性能
数据动静分离
静态数据
动态数据
热点数据的发现和隔离
发现
静态热点数据
定义
可以提前预测的热点数据,根据历史信息等做预测
发现
商家上报,运营系统标记
历史数据统计后推荐,比如每天访问的Top N
动态热点数据
定义
不能提前预测的热点数据,比如突然出现的爆款
发现
处理
优化
缓存
限制
隔离
请求削峰与分层隔离
削峰
为什么
保证服务端处理的平稳性
节省服务器的资源成本
怎么做
无损方案
排队
消息队列
FIFO内存排队算法
答题
防止秒杀器作弊
延缓请求,拉长峰值时间线
分层过滤
有损方案
限流
服务端极致优化
并发读优化
架构原则
4要
数据量要尽量少
含括路径
客户端-->服务端
服务端-->服务端
服务端-->客户端
为什么
数据在网络传输需要时间
序列化和反序列化,CPU杀手
服务端在写网络时,需要压缩和字符编码,消耗CPU资源
请求数尽量少
为什么
建立链接三次握手
js串行加载
不同域名DNS解析
编码解码
怎么做
合并CSS,JS
违背“数据量要尽量少”?
只在需要提升加载速度的页面做内联
路径尽量短
为什么
增加可用性
一次请求经过 5 个节点,每个节点的可用性是 99.9% 的话,那么整个请求的可用性是:99.9% 的 5 次方,约等于 99.5%
提升性能
减少中间节点,也就减少了中间的序列化和反序列化
怎么做
多个强依赖的应用合并部署到一起,把调用从RPC变成JVM内部调用
依赖尽量少
依赖分类
强依赖:下单流程中必不可少的环节。比如说支付系统,库存系统。
弱依赖:缺失之后不会导致下单失败的环节,比如优惠券
怎么做
对系统分级,层级高的系统不要对层级低的系统产生强依赖。比如,支付不要对优惠券产生强依赖,一定程度上可以降级优惠券,保证支付可用。
1不要
不能有单点
为什么
单点意味着没有备份,风险不可控。
怎么做
可以和服务器解耦
服务无状态化
统一配置中心
很难和服务器解耦,比如文件服务
冗余多个备份
Q&A
1
希望老师可以分别从1W QPS,10W QPS ,100WQPS在架构升级前遇到的性能瓶颈做为讲解入口点,为什么这样设计之后就能解决问题的方式,为什么切分点是1万,10万和100万,瓶颈的分析方式等等,感觉效果更好,否则看到一堆架构,但并不清楚为什么要这样做还是很难平移到自己的系统设计中,一点拙见,希望老师能够解惑
架构升级的逻辑要具体问题具体分析的
例如秒杀的场景来说,不同QPS量级下瓶颈也会不一样,10w级别可能瓶颈就在数据读取上,通过增加缓存一般就能解决,如果要到100w那么,可能服务端的网络可能都是瓶颈,所以要把大部分的静态数据放到cdn上甚至缓存在浏览器里
所以要做架构升级,还是主要要分析在预估的QPS下,整个系统的瓶颈会在什么地方,要针对这起瓶颈来重新设计架构方案
例如秒杀的场景来说,不同QPS量级下瓶颈也会不一样,10w级别可能瓶颈就在数据读取上,通过增加缓存一般就能解决,如果要到100w那么,可能服务端的网络可能都是瓶颈,所以要把大部分的静态数据放到cdn上甚至缓存在浏览器里
所以要做架构升级,还是主要要分析在预估的QPS下,整个系统的瓶颈会在什么地方,要针对这起瓶颈来重新设计架构方案
2
数据缓存在机器内存中的话,集群内如何实现多台机器数据一致性?
在内存的数据是静态数据,不会更新,没有一致性问题
3
1 .本地cache用什么实现好呢?
2. 通过什么方式往本地cache 写数据呢?
3. 秒杀系统的及时性非常高,把库存写进cache ,怎么及时更新呢?
2. 通过什么方式往本地cache 写数据呢?
3. 秒杀系统的及时性非常高,把库存写进cache ,怎么及时更新呢?
1.本地cache一般就是用内存实现,用java集合类型就行
2.用订阅的方式,在初始化时加载到内存
3.有两种方法,一是定时更新取3秒,二是,主动更新,数据库字段更新后发消息更新缓存,这个需要用到一个组件阿里叫metaq就是就是数据库字段更新会产生一条消息。另外cache里库存不需要100%和数据库一致,这个在后面的文章也有介绍
2.用订阅的方式,在初始化时加载到内存
3.有两种方法,一是定时更新取3秒,二是,主动更新,数据库字段更新后发消息更新缓存,这个需要用到一个组件阿里叫metaq就是就是数据库字段更新会产生一条消息。另外cache里库存不需要100%和数据库一致,这个在后面的文章也有介绍
4
秒杀的时间是怎么控制的,比如十点开始,十点十分结束。各个客户端、客户端与服务器、以及集群内的服务器之间。时间如何精确同步?
都是以服务端的时间为准,服务端的时间同步需要依赖一个时间同步组件完成如ntp
当然当前的服务器时间同步还是有一定的时间延时,但是也不是太影响
当然当前的服务器时间同步还是有一定的时间延时,但是也不是太影响
5
将大量的数据都放在缓存中,如何防止内存溢出了,内存溢出后的挽救方案怎么设计了
一般专门的缓存系统都有内存保护机制,一般超过内存空间都会淘汰一部分数据,你说的溢出是不是出现软件bug了才会出现
6
对被访问商品的 ID 做一致性 Hash,然后根据 Hash 做分桶,每个分桶设置一个处理队列,这样可以把热点商品限制在一个请求队列里
例如对每个请求的商品id取模,让后根据取模的结果分别设置多个linkedhashmap,每个map当做一个队列
0 条评论
下一页