什么是消息队列
相信很多人都对消息队列有或多或少的了解,而且网上的专业术语也很多.此处我讲解一下我自己的观点,消息队列是解耦不同计算速率系统并进行通信的工具.可以列举一个现实的场景:
大家在在去医院就诊的时候,会先去叫号排队,然后会在一个大屏幕上面显示所有排队患者,等上一个患者出来下一个患者再进去就医.此处医生和患者就好比两个系统,而屏幕上的排队信息就好比消息队列缓存需要就医的患者.假如没有此排队信息(消息队列)所有患者全部进去,医生也无法同时处理好所有患者病情.所以有个排队系统就可以大大缓解医生的压力.
秒杀场景的特点
现在几乎所有系统都是读多写少的场景,特别是系统初期阶段,对于此类场景可以使用缓存或者主备等方案来处理大量读请求.秒杀场景就恰恰相反,会在一瞬间有大批量写请求过来,例如大家熟知的天猫双十一、京东618等秒杀抢购的场景.
如何使用消息队列处理秒杀场景
其实消息队列在我们日常开发中经常看到:
-
Java线程池就会有队列暂存待处理任务,等到有空闲线程就直接从队列中取出任务处理.
-
不同系统之间信息交互,生产者就会把消息放到消息队列中,消费者回从消息队列查询并消费.
-
........
对于大批量写场景可以增加服务节点来快速处理写请求,但最终写请求压力都会来到数据库,按照以往思路做数据库分库分表、或者扩展数据库来支持更多的写操作,但这些操作无疑会增加系统和后期运维的复杂度,仅仅因为几次秒杀就把系统做的这么复杂显然是不可取的.
因此我们可以将大批量的写请求放到消息队列中,服务端直接返回给用户显示“系统处理中,请稍后”.后台启用多个消息队列线程来处理写请求,由于处理消息的线程数量是固定的,因此数据库的写请求也是固定的.暂存在消息队列中的请求会短暂堆积,当数据库中商品数量为0,消息队列中剩余请求也就可以丢弃了.
利用消息队列可以削平短暂的写流量高峰,虽然会造成一定的流量堆积和处理延迟,但是对于秒杀场景还是可以容忍的.
写在最后
消息队列可以作为系统秒杀场景的处理方案之一,同时也希望大家有什么其他好的方案在评论区讨论。关注程序员小徐,专注技术坑。