第一篇:为什么需要消息队列?
为什么需要消息队列上一篇我们聊完了 Redis 系列的最后一篇《Redis 为什么不能当数据库》。Redis 解决的是一个问题如何让系统访问数据更快。但是当系统继续发展流量继续增加只靠 Redis 还不够。因为很多时候系统慢并不是因为数据库慢也不是因为缓存慢而是因为一次请求需要同步完成太多事情。这也是消息队列Message QueueMQ出现的原因。一个最开始的订单系统刚开始开发一个电商系统下单逻辑可能非常简单。PostMapping(/order)publicLongcreateOrder(OrderRequestrequest){OrderorderorderService.create(request);returnorder.getId();}用户提交订单保存订单。返回结果没有任何问题。但是随着业务发展订单创建之后需要做的事情越来越多。比如扣减库存发送短信发放优惠券增加积分更新会员等级通知物流系统写入数据分析平台于是代码慢慢变成PostMapping(/order)publicLongcreateOrder(OrderRequestrequest){OrderorderorderService.create(request);stockService.reduce(order);couponService.send(order);pointService.add(order);smsService.send(order);logisticsService.notify(order);returnorder.getId();}从业务角度看这段代码没有错。订单创建之后这些事情确实都需要做。但是从系统设计角度它开始出现问题。第一个问题接口越来越慢假设每个服务耗时创建订单 20ms扣库存 30ms优惠券 50ms积分 20ms短信 500ms物流通知 200ms最终接口耗时20 30 50 20 500 200 820ms用户点击一次下单需要等待接近 1 秒。但是仔细想一下用户真的需要等待短信发送完成吗需要等待积分增加完成吗需要等待物流系统收到通知吗其实不需要。用户真正关心的是我的订单有没有创建成功。其他事情可以稍后完成。第二个问题服务之间越来越耦合更麻烦的是订单服务现在知道太多东西。它知道订单服务↓库存服务↓短信服务↓优惠券服务↓积分服务↓物流服务如果以后新增一个需求“下单后发送邮件”怎么办继续修改emailService.send(order);如果邮件系统异常创建订单成功↓发送邮件失败整个接口怎么办返回失败但是订单已经创建了这就出现了一个很经典的问题非核心业务失败影响核心业务。那能不能让订单服务只负责订单重新思考一下订单服务真正需要做什么其实只有创建订单告诉其他系统“订单创建成功了”至于谁需要这个消息怎么处理什么时候处理订单服务不应该关心。于是架构变成用户请求↓订单服务↓发送消息↓消息队列↓其他服务消费代码变成PostMapping(/order)publicLongcreateOrder(OrderRequestrequest){OrderorderorderService.create(request);rocketMQTemplate.send(order-created,order.getId());returnorder.getId();}订单服务只负责发送“订单创建成功” MQ 到底做了什么很多人理解 MQMQ 就是帮我存一条消息这个理解不完整。真正重要的是MQ 在系统之间增加了一层缓冲。以前订单服务↓短信服务订单服务必须等待短信服务完成。现在订单服务↓Broker↓短信服务订单服务只需要把消息交给 Broker后面的事情异步完成。这就是消息队列最核心的价值。那为什么不用 HTTP 调用既然服务之间可以 HTTP 调用为什么还需要 MQ比如smsService.send(order);换成POST /sms/send 不也可以吗区别在于HTTP 是主动调用。调用方必须知道谁提供服务地址是什么接口是什么对方是否成功。MQ 是消息通知。生产者只关心消息有没有发送出去。消费者只关心有没有自己感兴趣的消息。两者的关系完全不同。MQ 底层为什么需要 Broker这里其实已经涉及 MQ 的核心设计。很多初学者会想既然订单服务要通知短信服务。为什么不直接订单服务↓短信服务而要增加订单服务↓Broker↓短信服务中间这个 Broker 就是 MQ 的核心。它解决三个问题消息暂存如果短信服务挂了订单服务↓Broker↓短信服务异常消息不会消失等短信服务恢复后继续消费。消费速度不同订单创建每秒 10000 次。短信发送每秒只能处理 1000 次。如果直接调用订单服务也会被拖慢。有了 MQ10000 条消息↓Broker↓消费者慢慢处理生产和消费速度被隔离。多个消费者订阅同一个订单消息订单创建事件↓Broker/ |库存 积分 短信不同系统消费自己关心的数据订单服务不需要知道它们存在。RocketMQ 中消息到底怎么流转以 RocketMQ 为例。一次消息发送并不是Producer↓Consumer而是Producer↓NameServer↓Broker↓CommitLog↓ConsumerProducer 发送消息Broker 保存消息。Consumer 从 Broker 拉取消息。后面的文章我们会继续拆为什么消息需要 BrokerBroker 为什么选择 CommitLog为什么 RocketMQ 写消息这么快消息为什么不会丢消息为什么会重复消费这些才是 MQ 真正有意思的地方。总结消息队列出现不是因为开发者喜欢增加中间件。而是因为系统发展到一定阶段后简单的同步调用已经无法满足需求。当一个接口需要同时通知几十个系统时同步调用会让系统越来越慢服务依赖会越来越复杂。任何一个下游异常都可能影响核心流程。MQ 做的事情本质上就是把一次强依赖的同步调用变成一次可靠的消息通知。它让系统从你必须马上帮我完成变成我告诉你发生了什么你什么时候处理由你决定这就是消息队列存在的意义。上一篇《Redis 为什么不能当数据库》下一篇《消息为什么能够解耦系统》

相关新闻

【转载】亚马逊蝮蛇毒液多样性研究:生态和毒理学意义 | MDPI Toxins

【转载】亚马逊蝮蛇毒液多样性研究:生态和毒理学意义 | MDPI Toxins

蛇毒作为蝮蛇等毒蛇的关键生化武器,其组成与变异常被视为影响物种生态适应与生存成功的重要因素。然而,关于毒液成分是否直接决定蛇类在不同生态环境中的分布与生存策略,目前仍缺乏明确结论。来自巴西布坦坦研究所等多家科研机构的的Ana M. M…

2026/10/16 6:21:13 阅读更多 →
方差互换定价与VIX指数原理:从波动率交易到期权组合复制

方差互换定价与VIX指数原理:从波动率交易到期权组合复制

1. 从波动率交易说起:为什么我们需要方差互换?在金融衍生品的世界里,大家最熟悉的是基于资产价格方向性变化的工具,比如看涨期权、看跌期权、期货。你赌资产价格上涨,或者下跌,盈亏直接与价格挂钩。但有一类…

2026/10/17 0:53:10 阅读更多 →
Realtek多口网络芯片选型指南:从PHY、Switch到SGMII接口实战解析

Realtek多口网络芯片选型指南:从PHY、Switch到SGMII接口实战解析

1. 项目概述:解码Realtek多口网络芯片的选型迷宫最近在规划一个工控网关项目,需要选型一款支持多路以太网接口的芯片。客户的需求很明确:既要成本可控,又要接口灵活,最好还能集成一些交换功能。在翻遍了各大厂商的选型…

2026/10/18 10:36:12 阅读更多 →

最新新闻

2026网络安全就业全景:岗位趋势、薪酬地图与技能风向

2026网络安全就业全景:岗位趋势、薪酬地图与技能风向

1. 为什么我会在年底啃这份招聘数据:调研背景与样本口径每年四季度都是观察次年就业市场最好的窗口期,因为各大公司的HC预算、校招指标、社招编制基本都在这个阶段定调。我做了近十年的安全行业职业发展相关调研,今年选了2025年10月到2026年1…

2026/10/20 12:47:34 阅读更多 →
AI论文写作全攻略:四款实用工具与高效降重、文献综述实操指南

AI论文写作全攻略:四款实用工具与高效降重、文献综述实操指南

毕业季又到了,我后台收到最多的私信就是“论文写不出来怎么办”。说实话,毕业论文这事儿,卡在最后一步的滋味确实难受。今年我实测了市面上主流的几款AI论文写作工具,也拉了几个刚答辩完的同学做了深度反馈,今天直接把…

2026/10/20 12:47:34 阅读更多 →
圆的性质第二讲:垂径定理、圆周角定理与圆内接四边形实战要点

圆的性质第二讲:垂径定理、圆周角定理与圆内接四边形实战要点

圆的性质是初中几何里最"有看头"的一块内容——结论密集、模型多样,而且和代数、三角都能搭上关系。云藏山鹰代数信息系统的几何模块里,圆的性质系列课程我已经带过好几轮了,这次把第二讲的教学手记整理成文:垂径定理怎…

2026/10/20 12:47:34 阅读更多 →
AI编码新王炸Augment实测:大项目重构、对比Cursor与避坑指南

AI编码新王炸Augment实测:大项目重构、对比Cursor与避坑指南

1. 为什么“AI 写代码”最近突然又换了一个主角1.1 先认识一下这位“新王炸”是谁这几年 AI 编码工具的更新频率,说实话已经快到让人麻木的程度。今天这个大模型说自己的代码能力第一,明天那个编辑器说自己能自动改完一个项目,用户嘴上说“好…

2026/10/20 12:47:34 阅读更多 →
配电网重构MISOCP建模:二阶锥松弛与MATLAB实战

配电网重构MISOCP建模:二阶锥松弛与MATLAB实战

简介:本资源是一套基于混合整数二阶锥规划(MISOCP)求解配电网重构问题的完整MATLAB实现代码,面向电力系统优化、智能配电网研究方向的研究生、科研人员及工程技术人员。针对传统启发式或智能算法在全局最优性与收敛性上的局限&…

2026/10/20 12:47:34 阅读更多 →
提示词模板化:从基础到高级的Prompt Engineering实战指南

提示词模板化:从基础到高级的Prompt Engineering实战指南

1. 为什么要把提示词做成模板:从重复劳动到可复用资产先讲一个我自己的经历。早期用对话式AI干活的时候,每次都是临时想提示词,想到哪写到哪:“帮我总结一下这段文字”“写一个产品介绍,要专业一点”。这种随手写的做法…

2026/10/20 12:46:33 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →