高并发系统设计:消息队列应用

本文探讨了消息队列在秒杀场景中的关键作用,如削峰填谷,实现请求延迟处理,异步提升系统性能,以及解耦合增强系统鲁棒性。通过消息队列,系统能在高并发时避免直接对数据库造成压力,通过后台消费程序逐步处理订单和库存操作。同时,消息队列也用于次要业务逻辑的异步处理,确保主要流程的高效执行,并在系统间提供解耦合,降低相互依赖的影响。然而,使用消息队列也会带来延迟和消息丢失的风险,需要合理监控和策略应对。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

秒杀场景

  • 消息队列可以看作暂时存储数据的一个容器,一个平衡低速系统和高速系统处理任务时间差的工具。

  • 秒杀场景下短时间之内数据库的写流量会很高,如果去改造数据库,比如分库分表,比如做水平扩容等,都涉及到数据迁移,成本太高。而秒杀场景也就持续几十秒,得不偿失。

  • 消息队列在秒杀场景最主要的作用就是:削峰填谷。可以将请求暂存在消息队列,先返回给用户『结果计算中』,然后后台起几个消费程序去消费消息队列中的消息,再执行校验库存、下单等逻辑。当库存被消耗完之后,消息队列中堆积的请求就可以被丢弃了。

  • 虽然会有短暂延迟,但是只需要做好监控,堆积过多时多启动几个消费程序就好了。
    在这里插入图片描述

  • 消息队列还能起到异步处理的作用,比如消息处理的流程比较复杂,有主要的业务逻辑,也会有次要的业务逻辑:主要的流程是生成订单、扣减库存;次要的流程可能是我们在下单购买成功之后会给用户发放优惠券,会增加用户的积分。可以把次要流程再写入一个消息队列,然后用额外的消费程序去处理。这样可以增加在一定时间内的消费能力。尽快将结果通知给用户。

  • 在这里插入图片描述

  • 消息队列另一个作用是解耦合,比如数据团队要做统计,秒杀系统需要将数据发送给他们。如果直接使用http或者rpc请求,当数据团队的接口发生故障时,会影响到秒杀系统的可用性。当数据系统需要新的字段,就要变更接口的参数,那么秒杀系统也要随着一起变更。

  • 这个时候可以将请求写到消息队列,数据团队去消费。两个系统互不影响。
    在这里插入图片描述

总结

  • 削峰填谷是消息队列最主要的作用,但是会造成请求处理的延迟。
  • 异步处理是提升系统性能的神器,但是需要分清同步流程和异步流程的边界,同时消息存在着丢失的风险,需要考虑如何确保消息一定到达。
  • 解耦合可以提升整体系统的鲁棒性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值