RocketMQ消息队列:业务异步解耦、设备消息分发
RocketMQ消息队列业务异步解耦、设备消息分发订单创建后要发邮件、发短信、扣库存、记日志——如果全串行执行用户等得花都谢了。消息队列就是来解这种一个操作触发一堆事情的耦的。今天主角是阿里系扛把子 RocketMQ。一、消息队列三兄弟怎么选先看一张对比表帮你快速定位场景特性RocketMQRabbitMQKafka开发语言JavaErlangJava/Scala吞吐量10万级TPS万级TPS百万级TPS延迟毫秒级微秒级毫秒级顺序消息原生支持需额外处理分区内有序事务消息原生支持插件支持幂等去重延迟消息18个级别插件死信实现不支持原生集群依赖NameServer无自管理ZooKeeper适用场景电商交易、工控业务解耦日志采集、流计算选型建议RocketMQ阿里血统、事务消息原生支持、延迟消息现成可用适合电商和工控场景RabbitMQ轻量灵活、社区成熟适合一般业务解耦Kafka吞吐怪兽、持久化强悍适合日志、埋点、大数据管道二、RocketMQ 核心概念理解这几个概念RocketMQ 就入门了一半┌─────────────────────────────────────────────────┐ │ RocketMQ 架视图 │ │ │ │ ┌──────────┐ ← 路由信息 ┌──────────────────┐ │ │ │NameServer│ │ Broker │ │ │ │ 注册中心 │ │ ┌──────┬──────┐ │ │ │ └──────────┘ │ │Queue0│Queue1│ │ │ │ ↑ │ ├──────┼──────┤ │ │ │ ┌────┴────┐ │ │Queue2│Queue3│ │ │ │ │ │ │ └──────┴──────┘ │ │ │ ▼ ▼ └──────────────────┘ │ │ ┌──────┐ ┌──────┐ ↑ ↓ │ │ │Producer│Consumer│ │ │ │ │ │ 生产者 │ 消费者 │ │ │ │ │ └──────┘ └──────┘ │ │ │ │ 发送消息 拉取/推送消息 ←──────┘ └────── │ └─────────────────────────────────────────────────┘概念比喻说明Topic新闻频道消息的逻辑分类比如order-topicTag子栏目Topic 下的二级分类如order-create、order-payMessageQueue队列Topic 的物理分区一个 Topic 可配多个队列实现并行Producer Group记者团队同一类生产者集合事务消息中用于回溯Consumer Group读者俱乐部同一类消费者集合同一条消息只被组内一个消费者处理集群模式NameServer电话簿记录 Broker 和 Topic 的路由信息轻量级无状态其中 Tag 的设计很巧妙——你可以一个 Topic 承载订单全流程用 Tag 区分创建、支付、取消等不同事件消费者按 Tag 过滤。三、Docker 部署version:3services:namesrv:image:apache/rocketmq:5.1.0container_name:rmq-namesrvports:-9876:9876command:sh mqnamesrvbroker:image:apache/rocketmq:5.1.0container_name:rmq-brokerports:-10911:10911-10909:10909environment:-NAMESRV_ADDRnamesrv:9876command:sh mqbroker-c /home/rocketmq/conf/broker.confdepends_on:-namesrv启动后NameServer 监听 9876 端口Broker 监听 10911客户端通信端口。四、SpringBoot 整合 RocketMQ依赖dependencygroupIdorg.apache.rocketmq/groupIdartifactIdrocketmq-spring-boot-starter/artifactIdversion2.2.3/version/dependency配置rocketmq:name-server:127.0.0.1:9876producer:group:order-producer-groupsend-message-timeout:3000retry-times-when-send-failed:24.1 发送消息三种模式ServicepublicclassOrderMessageProducer{AutowiredprivateRocketMQTemplaterocketMQTemplate;// 同步发送等待 Broker 确认可靠性最高publicvoidsendSync(LongorderId){rocketMQTemplate.syncSend(order-topic:order-create,orderId);}// 异步发送不阻塞回调处理结果publicvoidsendAsync(LongorderId){rocketMQTemplate.asyncSend(order-topic:order-create,orderId,newSendCallback(){OverridepublicvoidonSuccess(SendResultresult){log.info(消息发送成功: {},result.getMsgId());}OverridepublicvoidonException(Throwablee){log.error(消息发送失败,e);// 补偿逻辑写表、重试等}});}// 单向发送不等结果性能最高但没保障publicvoidsendOneway(LongorderId){rocketMQTemplate.sendOneWay(order-topic:order-create,orderId);}}三种模式的选择同步适合核心业务要结果、异步适合非核心但要知道成败、单向适合日志采集丢了也无所谓。4.2 消费消息ComponentRocketMQMessageListener(topicorder-topic,consumerGroupstock-consumer-group,selectorExpressionorder-create,// 只消费 order-create 标签consumeModeConsumeMode.CONCURRENTLY// 并发消费)publicclassStockDeductConsumerimplementsRocketMQListenerOrderMessage{OverridepublicvoidonMessage(OrderMessagemessage){log.info(收到订单消息: {},message.getOrderId());// 处理库存扣减stockService.deduct(message.getProductId(),message.getQuantity());}}消费模式对比模式行为场景集群 (CLUSTERING)同组内一条消息只被一个实例消费服务多实例任务不重复执行广播 (BROADCASTING)同组内所有实例都收到同一条消息配置刷新、缓存更新通知五、消息类型5.1 顺序消息有些业务对顺序有强要求——比如订单的创建→支付→发货这三个消息不能乱序处理。RocketMQ 保证同一队列内的消息严格有序// 发送时指定发送到同一个消息队列rocketMQTemplate.syncSendOrderly(order-topic,orderMsg,orderId.toString());// ↑ 按此hash选择队列// 消费端改为顺序消费RocketMQMessageListener(topicorder-topic,consumerGrouporder-process-group,consumeModeConsumeMode.ORDERLY// 顺序消费模式)原理相同hashKey的消息落到同一个 Queue消费者在同一个 Queue 内串行处理。5.2 延迟消息下单 30 分钟未支付自动取消——这是经典的延迟消息场景// 延迟级别1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h// 级别 16 30 分钟MessageStringmsgMessageBuilder.withPayload(orderId.toString()).build();rocketMQTemplate.syncSend(order-topic:order-delay,msg,3000,16);RocketMQ 不支持任意时间的延迟只能选 18 个预设级别开源版 18 个商业版支持任意时间。如果 30 分钟不够精确可以用定时任务扫描做补充。5.3 事务消息这是 RocketMQ 的杀手锏——保证本地事务和消息发送的原子性Producer Broker Local DB │ │ │ │──①发送半消息────────→│ │ │←──②半消息确认────────│ │ │ │ │ │──③执行本地事务──────────────────────────→│ │←──④本地事务结果────────────────────────│ │ │ │ │──⑤提交/回滚────────→│ │ │ (COMMIT or ROLLBACK) │TransactionalpublicvoidcreateOrderWithTransaction(OrderDTOdto){// 发送事务消息rocketMQTemplate.sendMessageInTransaction(order-topic:order-create,MessageBuilder.withPayload(dto).build(),dto.getOrderId()// 事务参数);}// 事务监听器RocketMQTransactionListenerpublicclassOrderTransactionListenerimplementsRocketMQLocalTransactionListener{OverridepublicRocketMQLocalTransactionStateexecuteLocalTransaction(Messagemsg,Objectarg){try{// 执行本地事务写订单表OrderDTOdto(OrderDTO)((Message)msg).getPayload();orderMapper.insert(dto);returnRocketMQLocalTransactionState.COMMIT;}catch(Exceptione){returnRocketMQLocalTransactionState.ROLLBACK;}}OverridepublicRocketMQLocalTransactionStatecheckLocalTransaction(Messagemsg){// Broker 回调检查本地事务是否真的成功了StringorderId(String)((Message)msg).getPayload();OrderorderorderMapper.selectById(orderId);returnorder!null?RocketMQLocalTransactionState.COMMIT:RocketMQLocalTransactionState.ROLLBACK;}}事务消息的关键Broker 发送半消息后如果迟迟收不到生产者的 COMMIT/ROLLBACK会主动回调checkLocalTransaction方法确认结果。这就是回查机制——防止生产者挂了导致消息一直悬在半空。六、工控设备消息分发场景我司有个智慧农业项目几百个物联网设备温湿度传感器、水肥机、通风设备实时上报数据。用 RocketMQ 做消息分发设备层 消息队列层 消费者层 ┌─────────┐ ┌──────────────┐ ┌──────────────┐ │ 温度传感器 │──MQTT──→│ │ ←Tag──│ 实时报警服务 │ │ 湿度传感器 │──MQTT──→│ device-data │ ←Tag──│ 时序数据库写入 │ │ 水肥机 │──MQTT──→│ Topic │ ←Tag──│ 设备状态监控 │ │ 通风设备 │──MQTT──→│ │ ←Tag──│ 大屏数据推送 │ └─────────┘ └──────────────┘ └──────────────┘每个设备上报的消息带 Tagtemp、humidity、fertilizer不同消费者按 Tag 订阅自己关注的数据。设备数据量很大但单条不重要用单向发送模式压到最低延迟。七、常见踩坑消息重复消费幂等性网络抖动可能导致同一条消息被消费多次。解决方案——消费者端去重// 用 Redis 记录已处理的消息IDStringkeymsg:consumed:message.getMsgId();BooleansuccessredisTemplate.opsForValue().setIfAbsent(key,1,10,TimeUnit.MINUTES);if(Boolean.FALSE.equals(success)){log.warn(消息重复跳过: {},message.getMsgId());return;}// 正常处理业务...消息顺序性保证顺序消息意味着同一 Queue 串行处理吞吐量会下降。不要滥用只在确实要求顺序的场景使用。总结RocketMQ 在阿里内部分布式电商场景久经考验原生的顺序消息、事务消息、延迟消息能力让它特别适合需要复杂消息语义的场景。从业务解耦下单异步通知到工控数据分发设备数据管道RocketMQ 都能打出漂亮仗。记住同步送核心、异步送非核心、单向送日志幂等防重复。

相关新闻

基于Web Audio API的步进音序器开发指南:从原理到实践

基于Web Audio API的步进音序器开发指南:从原理到实践

这次我们来看一个个人开发者在家自制的音乐编曲应用。这个项目的核心不是又一个复杂的数字音频工作站(DAW),而是一个聚焦于“步进音序器”这一经典编曲方式的轻量化工具。它解决了传统DAW入门门槛高、操作复杂的问题,让音乐创作的…

2026/10/19 11:52:47 阅读更多 →
Seata分布式事务:跨服务数据一致性保障

Seata分布式事务:跨服务数据一致性保障

Seata分布式事务:跨服务数据一致性保障下单扣了库存,余额也扣了,结果订单创建失败——钱没了,货也没了,用户炸了。分布式事务就是来处理这种"要么全成功、要么全回滚"的跨服务烂摊子的。一、分布式事务是怎么…

2026/10/20 4:21:35 阅读更多 →
AI Agent技术实现与行业应用实践

AI Agent技术实现与行业应用实践

1. AI Agent时代的商业范式转型过去十年间,我见证过上百家企业从传统软件销售向智能化服务转型的完整历程。2023年成为AI Agent技术爆发的分水岭,最显著的变化是:客户不再满足于购买功能固化的软件包,而是需要能够封装行业know-ho…

2026/10/16 21:48:10 阅读更多 →

最新新闻

NetCMD 2.6.5 发布:五厂商离线路由交换命令生成器(华为/华三/锐捷/迈普/思科)

NetCMD 2.6.5 发布:五厂商离线路由交换命令生成器(华为/华三/锐捷/迈普/思科)

NetCMD 2.6.5 发布:五厂商离线路由交换命令生成器(华为/华三/锐捷/迈普/思科) 网络工程师配交换机路由器,最磨人的不是不会配,是同一件事五家写法各一套:华为 int g0/0/1、华三 int g1/0/1、思科 int g0/1&…

2026/10/20 10:47:40 阅读更多 →
STM32F103驱动AD7124实战:从SPI时序到多通道高精度采集

STM32F103驱动AD7124实战:从SPI时序到多通道高精度采集

简介:这份资源是面向STM32F103平台、针对AD7124高精度ADC芯片的完整驱动代码工程,适合正在调试该芯片却苦于缺少参考的嵌入式开发者与新手。作者基于Keil5环境,采用模拟SPI方式实现通信,测试代码聚焦6通道、双极性、全功率采样并启…

2026/10/20 10:47:40 阅读更多 →
调出最佳回答:PIIP-LLaVA生成参数temperature与top_p调优技巧清单

调出最佳回答:PIIP-LLaVA生成参数temperature与top_p调优技巧清单

【免费下载链接】PIIP-LLaVA_ConvNeXt-B_CLIP-L_1024-336_7B 项目地址: https://ai.gitcode.com/OpenGVLab/PIIP-LLaVA_ConvNeXt-B_CLIP-L_1024-336_7B 点击查看 免费下载 PIIP-LLaVA_ConvNeXt-B_CLIP-L_1024-336_7B 是一款多模态视觉指令模型:它用 Con…

2026/10/20 10:47:40 阅读更多 →
3 步搞定 emuMMC 备份与恢复:Atmosphere 保姆级指南

3 步搞定 emuMMC 备份与恢复:Atmosphere 保姆级指南

3 步搞定 emuMMC 备份与恢复:Atmosphere 保姆级指南 【免费下载链接】Atmosphere Atmosphre is a work-in-progress customized firmware for the Nintendo Switch. 项目地址: https://gitcode.com/GitHub_Trending/at/Atmosphere 有没有遇到过误断电或系统更…

2026/10/20 10:47:40 阅读更多 →
MQTT实战 - QoS 0-1-2 到底怎么选?一张图看懂(四)

MQTT实战 - QoS 0-1-2 到底怎么选?一张图看懂(四)

我是做物联网后端的老兵,8 年 .NET 开发,现在带一支研发团队做 .NET AIoT 架构。这个系列讲我真实项目里踩过的坑——不是抄来的入门教程。 QoS 这三个字母,可能是 MQTT 里被误解最深的东西。新手要么一句「当然全选 QoS 2,最可靠…

2026/10/20 10:47:40 阅读更多 →
Django+Vue宠物商店实战:库存原子扣减、订单状态机与RBAC权限落地

Django+Vue宠物商店实战:库存原子扣减、订单状态机与RBAC权限落地

简介:这是一套基于PythonDjangoVue.js全栈技术实现的宠物商店管理系统源码,专为计算机相关专业本科生毕业设计与课程设计打造,已通过导师审核并获98.5分高分评价,适用于毕设选题参考、项目实战训练及期末大作业开发。资源包共396个…

2026/10/20 10:46:38 阅读更多 →

日新闻

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 阅读更多 →