设计一个秒杀系统

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、拒绝服务

七、秒杀系统:应该是一个独立部署的系统,不应该占用其它资源

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值