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