一、场景
秒杀活动属于临时高并发写请求,在活动即将开始之前,面临的是高并发的毒请求,因为客户会疯狂刷新活动页面了解内容。
二、采用策略
大概策略有以下几种:缓存策略、
2.1、缓存策略
商品的数据可以放在缓存中,或者将静态资源放到CDN中(CDN加速技术)。减少对数据库的访问压力。
2.2、消息队列【削峰填谷】
用消息队列来存储提交的任务,RPC框架中,将请求写入队列,通过工作线程去处理。
问:为何不用分库分表?
答:分库分表会增加系统复杂性,还要坐数据迁移等。秒杀场景,高并发的写请求并非持续的,是非连续的,可能只有几秒或者几十秒就会结束,如果采用分库分表,得不偿失。
故,可以将秒杀请求暂时写入存储在消息队列中,之后用业务服务器告知用户“秒杀进行中”等,等待释放系统资源后再去处理其他用户请求。
具体就是部署N台队列处理程序,不断的消费消息队列中的任务,然后校验库存,之后下单操作等。用户请求时可以在消息队列中短暂堆积的,当库存为零,消息堆积的请求就可以全部释放。
注意:秒杀过程不能长时间不给用户响应,只能短暂的延迟通知结果。写入流量的大小和数据库处理能力需要提前做好评估,最后根据不同量级决定部署的处理程序台数。
关键字:削峰填谷
2.3、消息队列【异步化机制】
秒杀场景下,一个购买请求流程,是有主次之分的。次要流程不该和主要流程一起同步执行,会增加响应时间。比如主要流程为创建订单和扣减库存,次要流程发放优惠券和增加用户积分等操作就可以放到下单成功后异步处理。
2.4、消息队列【解耦】
比如公司大数据团队有个需求,需要对秒杀活动进行统计数据,用以分析活动商品的受欢迎程度、用户满意度等相关指标。
问:为何不使用传统HTTP或者RPC方式来同步调用?
答:1、整个系统耦合度较高。如果大数据团队接口出问题,会影响我们的秒杀系统。
2、如果大数据团队变更接口,秒杀系统还要响应的更改接口。
消息队列的解耦:
1、秒杀系统产生一条购买数据,我们先将全部数据发送到消息队列中。
2、然后大数据团队自己订阅消息队列Topic。
3、最后他们自己做数据处理方面的工作。
如此,大数据团队的系统故障和接口变更就不会队秒杀系统造成影响,接口变更也不会相互影响,实现了系统解耦。
三、总结
消息对垒的削峰填谷、异步处理、解耦在秒杀活动中起到了只管重要的作用。
- 削峰填谷可以削掉到达秒杀系统的峰值流量,让业务逻辑处理更加缓和自然;
- 异步处理可以简化整个业务流程的步骤从而提升系统性能;
- 解耦合可以将秒杀系统和大数据系统解耦开,这样彼此间的任何变更都不会影响到对方,提升系统整体的鲁棒性。
标签:请求,队列,系统,秒杀,消息,分布式系统,设计,填谷 From: https://www.cnblogs.com/xiaobaicai12138/p/17797168.html