秒杀系统设计!

1. 秒杀的业务特点

1、瞬时并发量大:大量用户会在同一时间抢购,网站流量瞬间激增。

2、库存少:一般都是低价限量,而访问的数量远远大于库存数量,只有极少数人成功。

3、业务流程简单:流程短,立即购买,下订单,减库存。

4、前期预热:对于还未开启活动的秒杀商品,以倒计时的方式显示,只能访问不能下单。

2 设计思路

在这里插入图片描述
1、限流:只能让秒杀成功的一小部分人进入到后台,和数据库进行交互,来减少数据库服务器的压力。

2、缓存:将部分业务逻辑写到缓存里,例如:商品限购数量、秒杀政策等。

3、异步:将业务逻辑拆分,减少服务器压力,例如:正常业务流程是下订单、付款、减库存同一时间完成,秒杀时可以将业务逻辑拆分。

4、预热:商家进行宣传,并提前设置好秒杀的商品、秒杀时间、限购数量,将设置的商品写入 redis 缓存。

5、展示:页面分为两层,第一层是商品列表页,第二层是商品详情页,通过商品列表页链接进入商品详情页,秒杀开始前,展示商品秒杀倒计时,不允许操作提交订单,只允许查看商品详情。秒杀开始时,展示商品秒杀到期时间。

6、提交订单:秒杀提交完订单将 redis 缓存里的数量减少,并提示支付。

7、队列操作:当支付成功之后,将秒杀成功详情写入 rabbitMQ,订单服务进行监听接收消息写入订单,库存服务进行监听接收消息减少库存。

8、时间服务器:页面服务端通过负载进行布署,各服务器时间可能会不一致,因此增加时间服务,来提供统一的时间。
**

2.4. 技术架构

在这里插入图片描述
整体架构图:

Eureka Client:

时间服务(leyouTimeServer,端口号8000):为页面服务提供时间统一的接口。

商品服务(leyouStock,端口号7000):对外提供的接口(商品列表、商品详情、秒杀政策)。

库存服务(leyouStorage,端口号6001):队列监听,在队列中提取消息与数据库交互减少库存。

会员服务(leyouUser,端口号5000):为页面服务提供会员数据接口,会员的添加、修改、登录。

订单服务(leyouOrder,端口号4000):队列监听,在队列中提取消息与数据库交互生成订单。

页面服务(leyouClient,端口号3000):为前端页面提供数据接口。

Eureka Server:

注册中心(leyouServer,端口号9000)各服务都在注册中心进行注册。

配置中心 (leyouConfig):提供所有服务需要的配置。

Redis的应用:在这里插入图片描述
缓存商品数量、秒杀政策。

商家对秒杀政策、商品限量进行设置,设置完成写入Redis。

消费者访问商品详情,提交订单之后,从Redis中减少商品数量。

Redis里存取内容:

1、在政策新增的时候存入,key的值为:LIMIT_POLICY_{sku_id},value的值为政策内容

2、商品列表取数据时,通过key(LIMIT_POLICY_{sku_id}),取出政策内容。

3、政策到期之后,自动删除。

RabbitMQ的应用:在这里插入图片描述
消费者提交订单,自动写入订单队列:

订单队列:订单服务监听订单队列,接收到消息之后将队列信息写入数据库订单表。

消费者付款之后,更新订单状态,更新成功之后写入库存队列

库存队列:库存服务监听库存队列,接收到消息之后将库存信息写入数据库减少库存。

**

总结来自三太子敖丙大神:

**
1,高并发,单机的Redis3-4W的QPS还是能顶得住,再高就扛不住了,可能会发生缓存雪崩缓存击穿缓存穿透

2,超卖

3,恶意请求

4,链接暴露

5,数据库:每秒上万甚至十几万的QPS(每秒请求数)直接打到数据库

解决方案:

1,服务单一职责,创建秒杀模块 专门建立秒杀数据库,好处挂了不会影响其他服务

2,秒杀链接加盐:URL动态化通过MD5之类的加密算法加密随机的字符串去做url,然后通过前端代码获取url后台校验才能通过。

3,Redis集群 主从同步读写分离搞点哨兵,开启持久化

4,Nginx高性能的web服务器,并发也顶几万不是梦,但是我们的Tomcat只能顶几百的并发呀,那简单呀负载均衡嘛,一台服务几百,那就多搞点,在秒杀的时候多租点流量机

5,资源静态化:秒杀一般都是特定的商品还有页面模板,那就把能提前放入cdn服务器的东西都放进去

6,按钮控制:秒杀前,按钮设置灰色的,只有时间到了,才能点击。

前端的配合,定时请求后端服务器,获取最新的北京时间,到时间点再给按钮可用状态。

按钮可以点击之后也得给他置灰几秒,不然他一样在开始之后一直点的

7,限流

前端限流:一般秒杀不会让你一直点的,一般都是点击一下或者两下然后几秒之后才可以继续点击,这也是保护服务器的一种手段。

后端限流:秒杀的时候肯定是涉及到后续的订单生成和支付等操作,那一旦100个产品卖光了,return了一个false,前端直接秒杀结束,然后你后端也关闭后续无效请求的介入了。限流组件:阿里的Sentinel、Hystrix等

8,库存预热:秒杀的本质,就是对库存的抢夺通过定时任务提前把商品的库存加载到Redis中让整个流程都在Redis里面去做,然后等秒杀结束了,再异步的去修改库存就好了。

9,Lua :写一个脚本把判断库存扣减库存的操作都写在一个脚本丢给Redis去做,那到0了后面的都Return False了是吧,一个失败了你修改一个开关,直接挡住所有的请求,然后再做后面的事情嘛。

10,限流&降级&熔断&隔离:

限流,顶不住就挡一部分出去但是不能说不行

降级,降级了还是被打挂了

熔断,至少不要影响别的系统

隔离,你本身就独立的,但是你会调用其他的系统嘛,你快不行了你别拖累兄弟们啊。

11,削峰填谷:

一说到这个名词,很多小伙伴就知道了,对的MQ,你买东西少了你直接100个请求改库我觉得没问题,但是万一秒杀一万个,10万个呢?服务器挂了

你可以把它放消息队列,然后一点点消费去改库存就好了不过单个商品其实一次修改就够了,我这里说的是某个点多个商品一起秒杀的场景,像极了双十一零点。

**

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值