系统的秒杀场景原来可以用消息队列处理

本文解释了消息队列作为工具在处理不同计算速率系统间的通信,以医院排队为例。针对秒杀场景,作者介绍了如何利用消息队列削平写流量高峰,降低数据库压力,并提倡其作为秒杀解决方案之一,鼓励读者分享更多见解。
摘要由CSDN通过智能技术生成

什么是消息队列

相信很多人都对消息队列有或多或少的了解,而且网上的专业术语也很多.此处我讲解一下我自己的观点,消息队列是解耦不同计算速率系统并进行通信的工具.可以列举一个现实的场景:

大家在在去医院就诊的时候,会先去叫号排队,然后会在一个大屏幕上面显示所有排队患者,等上一个患者出来下一个患者再进去就医.此处医生和患者就好比两个系统,而屏幕上的排队信息就好比消息队列缓存需要就医的患者.假如没有此排队信息(消息队列)所有患者全部进去,医生也无法同时处理好所有患者病情.所以有个排队系统就可以大大缓解医生的压力.

叫号排队

秒杀场景的特点

现在几乎所有系统都是读多写少的场景,特别是系统初期阶段,对于此类场景可以使用缓存或者主备等方案来处理大量读请求.秒杀场景就恰恰相反,会在一瞬间有大批量写请求过来,例如大家熟知的天猫双十一、京东618等秒杀抢购的场景.

如何使用消息队列处理秒杀场景

其实消息队列在我们日常开发中经常看到:

  • Java线程池就会有队列暂存待处理任务,等到有空闲线程就直接从队列中取出任务处理.

  • 不同系统之间信息交互,生产者就会把消息放到消息队列中,消费者回从消息队列查询并消费.

  • ........

对于大批量写场景可以增加服务节点来快速处理写请求,但最终写请求压力都会来到数据库,按照以往思路做数据库分库分表、或者扩展数据库来支持更多的写操作,但这些操作无疑会增加系统和后期运维的复杂度,仅仅因为几次秒杀就把系统做的这么复杂显然是不可取的.

因此我们可以将大批量的写请求放到消息队列中,服务端直接返回给用户显示“系统处理中,请稍后”.后台启用多个消息队列线程来处理写请求,由于处理消息的线程数量是固定的,因此数据库的写请求也是固定的.暂存在消息队列中的请求会短暂堆积,当数据库中商品数量为0,消息队列中剩余请求也就可以丢弃了.

削峰流量

利用消息队列可以削平短暂的写流量高峰,虽然会造成一定的流量堆积和处理延迟,但是对于秒杀场景还是可以容忍的.

写在最后

消息队列可以作为系统秒杀场景的处理方案之一,同时也希望大家有什么其他好的方案在评论区讨论。关注程序员小徐,专注技术坑

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值