RocketMQ-技术详解
----------------------------------------------------------------------------------------
RocketMQ 集成基础知识(新手友好版)
RocketMQ 是阿里开源的分布式消息中间件,核心用于解决系统间异步通信、削峰填谷、解耦等问题(比如电商下单后通知物流、支付回调、日志异步采集等场景)。下面从「核心概念→环境准备→基础集成→核心操作」一步步讲,新手能直接跟着做。
一、核心概念(先懂这些,集成不懵)
表格
| 概念 | 通俗解释 |
|---|---|
| Producer | 消息生产者:负责发送消息到 RocketMQ(比如下单系统发送 “订单创建” 消息) |
| Consumer | 消息消费者:负责接收并处理消息(比如物流系统接收 “订单创建” 消息开始发货) |
| Topic | 消息主题:消息的 “分类标签”,生产者发消息到指定 Topic,消费者订阅 Topic 收消息 |
| Queue | 队列:Topic 下的细分队列,用于负载均衡(一个 Topic 可包含多个 Queue) |
| Broker | RocketMQ 服务端节点:存储消息、转发消息(核心服务) |
| NameServer | 注册中心:管理 Broker 地址,生产者 / 消费者通过它找到 Broker |
| Group | 分组:Producer Group(生产者分组)/ Consumer Group(消费者分组),用于标识一组生产 / 消费实例 |
| 消息模式 | 集群模式(同组消费者分摊消息)、广播模式(同组消费者都收到所有消息) |
二、环境准备(以 Java 为例,最常用)
- 安装 RocketMQ:先部署 RocketMQ 服务端(本地测试可装单机版),步骤:
- 下载安装包(https://rocketmq.apache.org/zh/download/);
- 启动 NameServer:
nohup sh bin/mqnamesrv &; - 启动 Broker:
nohup sh bin/mqbroker -n localhost:9876 &。
- 项目依赖:Maven 引入核心依赖(Spring Boot 项目推荐用 rocketmq-spring-boot-starter):
xml
<!-- Spring Boot 集成依赖(推荐) -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.3</version>
</dependency>
<!-- 原生依赖(非 Spring Boot 项目) -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.9.7</version>
</dependency>
- 配置文件(application.yml):Spring Boot 项目配置 RocketMQ 连接信息:
yaml
rocketmq:
name-server: localhost:9876 # NameServer 地址
producer:
group: demo-producer-group # 生产者分组
send-message-timeout: 3000 # 发送超时时间
consumer:
group: demo-consumer-group # 消费者分组
三、基础集成:生产 / 消费消息(开箱即用)
1. 消息生产者(发送消息)
java
运行
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class DemoProducer {
// 注入 RocketMQ 模板(Spring Boot 封装好的工具)
@Autowired
private RocketMQTemplate rocketMQTemplate;
// 发送普通同步消息(最常用)
public void sendNormalMessage(String topic, String msg) {
try {
// 参数1:Topic名称(可加Tag,格式:topic:tag);参数2:消息内容
rocketMQTemplate.convertAndSend(topic, msg);
System.out.println("消息发送成功:" + msg);
} catch (Exception e) {
System.out.println("消息发送失败:" + e.getMessage());
// 失败可重试/记录日志
}
}
}
2. 消息消费者(接收消息)
java
运行
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
// 注解配置:topic=订阅的主题,consumerGroup=消费者分组
@Component
@RocketMQMessageListener(topic = "demo-topic", consumerGroup = "demo-consumer-group")
public class DemoConsumer implements RocketMQListener<String> {
// 接收到消息后执行的方法
@Override
public void onMessage(String msg) {
try {
// 处理消息(比如业务逻辑:更新订单状态、通知物流等)
System.out.println("收到消息:" + msg);
// 无需手动确认,默认自动确认(集群模式下消息会分摊给同组消费者)
} catch (Exception e) {
System.out.println("消息处理失败:" + e.getMessage());
// 处理失败可抛异常,RocketMQ 会重试(默认重试16次)
}
}
}
3. 测试调用
java
运行
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class RocketMQDemoApplication {
public static void main(String[] args) {
SpringApplication.run(RocketMQDemoApplication.class, args);
}
// 项目启动后发送测试消息
@Bean
public CommandLineRunner testSendMessage(DemoProducer producer) {
return args -> {
producer.sendNormalMessage("demo-topic", "这是一条测试纠纷案件消息");
};
}
}
四、关键注意事项(新手避坑)
- Topic 需提前创建:可通过 RocketMQ 控制台或命令行创建,否则发送消息会失败;
- 分组命名规范:Producer Group/Consumer Group 建议按 “业务 - 环境” 命名(如 order-producer-dev);
- 消息重试:消费者处理失败时,RocketMQ 会自动重试(默认 16 次),可配置重试次数和间隔;
- 消息持久化:RocketMQ 默认将消息持久化到磁盘,即使 Broker 重启,消息也不会丢失;
- 幂等性处理:消费者需保证 “重复消费同一条消息时,业务结果一致”(比如用消息 ID 做唯一键去重)。
总结
- RocketMQ 核心是「生产者发消息到 Topic,消费者订阅 Topic 收消息」,NameServer 负责地址管理,Broker 负责存储和转发;
- Java 集成优先用
rocketmq-spring-boot-starter,只需配置 NameServer 地址和分组,即可快速实现生产 / 消费; - 集成时重点关注 Topic 创建、分组规范、消息重试和幂等性,避免消息丢失或重复处理。
----------------------------------------------------------------------------------------
一、RocketMQ 核心概念(极简版,新手必记)
先通过 “业务场景 + 通俗解释” 记住核心概念,避免死记硬背:
表格
| 核心概念 | 通俗解释(纠纷案件场景举例) | 核心作用 |
|---|---|---|
| NameServer | 消息中间件的 “地址簿” | 管理 Broker 地址,让生产 / 消费者找到 Broker |
| Broker | 消息的 “仓库 + 快递站” | 存储消息、转发消息(核心服务节点) |
| Topic | 消息的 “分类标签” | 比如 “case-status-topic”(案件状态变更),生产者发消息到指定 Topic,消费者订阅 Topic 收消息 |
| Queue | Topic 下的 “子信箱” | 一个 Topic 可拆多个 Queue,实现负载均衡(同组消费者分摊消息) |
| Producer | 消息生产者(比如案件系统) | 发送 “案件立案 / 结案” 等消息到 Topic |
| Consumer | 消息消费者(比如通知系统 / 归档系统) | 订阅 Topic,接收并处理 “案件状态变更” 消息 |
| Group | 生产 / 消费者的 “团队标识” | Producer Group(案件系统集群)/ Consumer Group(通知系统集群),标识一组实例 |
| Tag | Topic 下的 “子标签” | 比如 Topic=case-topic,Tag=litigation(诉讼)/arbitration(仲裁),实现消息精准过滤 |
| Message ID | 消息的 “唯一身份证” | 用于消息去重、幂等性处理 |
二、核心使用代码(开箱即用,Spring Boot 版)
1. 前置准备
- Maven 依赖(Spring Boot 项目):
xml
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.3</version>
</dependency>
- 配置文件(application.yml):
yaml
spring:
application:
name: rocketmq-demo
rocketmq:
name-server: localhost:9876 # NameServer 地址(本地测试)
producer:
group: case-producer-group # 生产者分组(案件系统)
send-message-timeout: 3000 # 发送超时时间
retry-times-when-send-failed: 2 # 发送失败重试次数
consumer:
group: case-consumer-group # 消费者分组(通知系统)
2. 核心代码:生产 / 消费消息
(1)消息生产者(发送案件状态变更消息)
java
运行
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 纠纷案件消息生产者:发送案件状态变更消息
*/
@Component
public class CaseProducer {
// Spring Boot 封装的 RocketMQ 模板
@Autowired
private RocketMQTemplate rocketMQTemplate;
/**
* 发送普通同步消息(最常用)
* @param topic 消息主题(可加Tag,格式:topic:tag)
* @param caseMsg 消息内容(比如案件ID+状态)
*/
public void sendCaseStatusMessage(String topic, String caseMsg) {
try {
// 发送消息(同步发送,等待返回结果)
SendResult sendResult = rocketMQTemplate.syncSend(topic, caseMsg);
// 打印发送结果(成功/失败状态、消息ID等)
System.out.println("消息发送成功:" + sendResult);
System.out.println("消息ID:" + sendResult.getMsgId());
} catch (Exception e) {
// 发送失败处理(记录日志、告警、重试等)
System.err.println("消息发送失败:" + e.getMessage());
}
}
/**
* 发送带Tag的消息(精准过滤)
* @param caseType 案件类型(litigation=诉讼/arbitration=仲裁)
* @param caseMsg 消息内容
*/
public void sendCaseMessageWithTag(String caseType, String caseMsg) {
// Topic+Tag格式:case-status-topic:litigation
String topicWithTag = "case-status-topic:" + caseType;
sendCaseStatusMessage(topicWithTag, caseMsg);
}
}
(2)消息消费者(接收并处理案件消息)
java
运行
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
/**
* 纠纷案件消息消费者:接收案件状态变更消息
* 注解说明:
* - topic:订阅的主题
* - consumerGroup:消费者分组
* - messageModel:消息模式(CLUSTERING=集群模式,BROADCASTING=广播模式)
* - consumeMode:消费模式(CONCURRENTLY=并发消费,ORDERLY=顺序消费)
*/
@Component
@RocketMQMessageListener(
topic = "case-status-topic", // 订阅的主题
consumerGroup = "case-consumer-group", // 消费者分组
messageModel = MessageModel.CLUSTERING, // 集群模式(同组消费者分摊消息)
consumeMode = ConsumeMode.CONCURRENTLY // 并发消费(提高效率)
)
public class CaseConsumer implements RocketMQListener<String> {
/**
* 接收到消息后的处理方法(核心逻辑)
* @param msg 消息内容
*/
@Override
public void onMessage(String msg) {
try {
// 1. 打印接收到的消息
System.out.println("收到案件消息:" + msg);
// 2. 业务处理(比如:更新案件状态、发送短信通知、归档文件等)
handleCaseMessage(msg);
// 3. 无需手动确认,默认自动确认(处理成功则消息从队列移除)
} catch (Exception e) {
// 处理失败:抛异常则RocketMQ会重试(默认16次,可配置)
System.err.println("消息处理失败:" + e.getMessage());
throw new RuntimeException("消息处理失败,触发重试", e);
}
}
/**
* 业务逻辑处理:解析消息并处理案件状态变更
*/
private void handleCaseMessage(String msg) {
// 示例:解析消息(格式:案件ID-状态,比如 "CASE001-立案成功")
String[] caseInfo = msg.split("-");
String caseId = caseInfo[0];
String caseStatus = caseInfo[1];
// 模拟业务处理
System.out.println("处理案件[" + caseId + "],状态更新为:" + caseStatus);
}
}
(3)测试代码(项目启动后发送测试消息)
java
运行
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class RocketMQCaseApplication {
public static void main(String[] args) {
SpringApplication.run(RocketMQCaseApplication.class, args);
}
// 项目启动后自动发送测试消息
@Bean
public CommandLineRunner testCaseMessage(CaseProducer producer) {
return args -> {
// 发送普通案件消息
producer.sendCaseStatusMessage("case-status-topic", "CASE001-立案成功");
// 发送带Tag的诉讼案件消息
producer.sendCaseMessageWithTag("litigation", "CASE002-开庭通知");
};
}
}
3. 关键补充:常用消息类型(按需扩展)
表格
| 消息类型 | 代码示例(基于上面的 Producer) | 适用场景 |
|---|---|---|
| 异步消息 | rocketMQTemplate.asyncSend(topic, msg, new SendCallback() { ... }) |
不等待结果,提高接口响应速度 |
| 延时消息 | rocketMQTemplate.syncSend(topic, msg, 3000, 3)(3 = 延时 10 秒) |
案件到期提醒、定时处理 |
| 顺序消息 | 消费者注解设置 consumeMode = ConsumeMode.ORDERLY |
案件流程按顺序处理(立案→审理→结案) |
三、核心操作验证
- 启动 RocketMQ:先启动 NameServer → 再启动 Broker
bash运行
# 启动NameServer nohup sh bin/mqnamesrv & # 启动Broker(本地测试) nohup sh bin/mqbroker -n localhost:9876 & - 创建 Topic(通过命令行):
bash运行
sh bin/mqadmin updateTopic -n localhost:9876 -b localhost:10911 -t case-status-topic - 运行项目:启动 Spring Boot 应用,控制台会打印:
- 生产者:
消息发送成功:SendResult{msgId='xxx', ...} - 消费者:
收到案件消息:CASE001-立案成功→处理案件[CASE001],状态更新为:立案成功
- 生产者:
总结
- 核心概念:RocketMQ 核心是「NameServer 找地址,Broker 存消息,Producer 发 Topic,Consumer 订阅 Topic」,Group 标识集群实例,Tag 实现消息过滤;
- 核心代码:Spring Boot 集成只需配置 NameServer 和分组,通过
RocketMQTemplate发送消息,通过@RocketMQMessageListener注解实现消费; - 关键注意:Topic 需提前创建,消费者要处理幂等性(避免重复消费),失败时抛异常触发重试。
如果需要针对 “纠纷案件” 场景定制(比如顺序处理案件流程、延时发送开庭提醒),可以告诉我,我会补充对应的代码和配置。
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
