消息队列入门:为什么系统之间需要一个“缓冲带”

举报
yd_213156404 发表于 2026/11/05 13:44:32 2026/11/05
【摘要】 一、从一次下单说起用户点一下“下单”,系统常常要同时做很多事:生成订单、扣减库存、发送短信、记录日志、通知仓库。如果把这些步骤全部写在一次请求里串行执行,接口会越来越慢,任何一个环节出错,都可能拖垮整条链路。更麻烦的是,下单服务还要直接认识短信、仓储等服务,改一处就要动全身。消息队列就是为了解决这种耦合而出现的中间层。它让“发出消息的人”和“处理消息的人”不再直接对话,而是通过一个可靠的缓...

一、从一次下单说起

用户点一下“下单”,系统常常要同时做很多事:生成订单、扣减库存、发送短信、记录日志、通知仓库。如果把这些步骤全部写在一次请求里串行执行,接口会越来越慢,任何一个环节出错,都可能拖垮整条链路。更麻烦的是,下单服务还要直接认识短信、仓储等服务,改一处就要动全身。

消息队列就是为了解决这种耦合而出现的中间层。它让“发出消息的人”和“处理消息的人”不再直接对话,而是通过一个可靠的缓冲带传递信息。生产者只管把消息投递出去,消费者在自己方便的时候取出来处理,双方不必同时在线,也不需要互相等待。

二、三个角色与两种模式

消息队列里有三个角色:生产者负责产生消息,例如订单服务在下单成功后发出“订单已创建”;队列负责暂存消息,并按规则交给合适的消费者;消费者负责真正干活,例如短信服务发送短信、仓储服务安排拣货。生产者和消费者只要约定好消息的格式,就不需要关心对方用什么语言、部署在哪里。

常见的消息模型有两种。点对点模式下,一条消息只会被一个消费者处理,适合任务分发;发布订阅模式下,一条消息可以被多个订阅者各自处理一次,适合事件通知,例如订单创建后,短信、积分、仓储服务各取所需、互不干扰。

三、它解决了什么问题

首先是解耦。订单服务不再直接调用短信和仓储接口,新增积分服务时,也不需要改动订单代码,只需订阅已有的订单消息。其次是削峰填谷。秒杀时请求量可能是平时的几十倍,队列可以先把请求排队,再以消费者承受得住的速度慢慢处理,系统就不会被瞬间洪峰冲垮。第三是异步提速。对用户来说,最关键的是“下单成功”这个结果,短信是否立刻到达并不影响这次操作,把非关键步骤异步处理,主流程就能更快返回。

四、新手容易踩的坑

使用消息队列也有代价。第一是顺序问题:同一个订单的“创建”和“取消”如果被乱序处理,结果可能出错,必要时要按业务键把相关消息路由到同一分区。第二是重复消费:网络抖动或处理超时可能导致同一条消息被投递两次,消费逻辑最好做到幂等,即重复执行与执行一次的结果相同。第三是失败处理:一直失败的消息不应无限重试、拖垮队列,通常会进入死信队列,等待人工排查。

五、小结

一句话总结:消息队列不是为了让系统变复杂,而是让系统之间通过“先存下来、再慢慢处理”的方式松绑。它牺牲了一点实时性,换来了更低的耦合、更平滑的流量和更快的核心流程。入门时可以先从身边的小项目练起:把一次操作拆成主流程和后续通知,用本地队列模拟生产和消费,观察顺序、重试和失败处理,再逐步过渡到真实的消息服务。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。