秒杀场景
-
消息队列可以看作暂时存储数据的一个容器,一个平衡低速系统和高速系统处理任务时间差的工具。
-
秒杀场景下短时间之内数据库的写流量会很高,如果去改造数据库,比如分库分表,比如做水平扩容等,都涉及到数据迁移,成本太高。而秒杀场景也就持续几十秒,得不偿失。
-
消息队列在秒杀场景最主要的作用就是:
削峰填谷
。可以将请求暂存在消息队列,先返回给用户『结果计算中』,然后后台起几个消费程序去消费消息队列中的消息,再执行校验库存、下单等逻辑。当库存被消耗完之后,消息队列中堆积的请求就可以被丢弃了。 -
虽然会有短暂延迟,但是只需要做好监控,堆积过多时多启动几个消费程序就好了。
-
消息队列还能起到
异步处理
的作用,比如消息处理的流程比较复杂,有主要的业务逻辑,也会有次要的业务逻辑:主要的流程是生成订单、扣减库存;次要的流程可能是我们在下单购买成功之后会给用户发放优惠券,会增加用户的积分。可以把次要流程再写入一个消息队列,然后用额外的消费程序去处理。这样可以增加在一定时间内的消费能力。尽快将结果通知给用户。 -
-
消息队列另一个作用是解耦合,比如数据团队要做统计,秒杀系统需要将数据发送给他们。如果直接使用http或者rpc请求,当数据团队的接口发生故障时,会影响到秒杀系统的可用性。当数据系统需要新的字段,就要变更接口的参数,那么秒杀系统也要随着一起变更。
-
这个时候可以将请求写到消息队列,数据团队去消费。两个系统互不影响。
总结
- 削峰填谷是消息队列最主要的作用,但是会造成请求处理的延迟。
- 异步处理是提升系统性能的神器,但是需要分清同步流程和异步流程的边界,同时消息存在着丢失的风险,需要考虑如何确保消息一定到达。
- 解耦合可以提升整体系统的鲁棒性。