一、Rocketmq的安装与使用
概述:
RocketMQ基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。
二、安装
需要jdk1.8 jdk安装不能是中文,不能有空格
tomcat配置也是不能有空格的,不能再program files文件夹里面
否则:Broker(需要jdk) NameServer(需要tomcat)不能正常启动
第一步官网下载
点击下载-官网 | RocketMQ (apache.org)
第二步配置环境变量
a)系统变量
b)path路径
c)查看jdk路径是否有空格,默认是在progman Files里面,有空格需要进行移动(重要)
d)tomcat不能有空格,两处地方
- CATALINA_HOME
- CLASSPATH
第三部,配置完成之后进行测试
三、NameServer说明与启动
NameServer是一个Broker与Topic路由的注册中心,支持Broker的动态注册与发现。
Broker管理:接受Broker集群的注册信息并且保存下来作为路由信息的基本数据;提供心跳检测 机制,检查Broker是否还存活。
路由信息管理:每个NameServer中都保存着Broker集群的整个路由信息和用于客户端查询的队列 信息。Producer和Conumser通过NameServer可以获取整个Broker集群的路由信息,从而进行消 息的投递和消费。
相对来说,nameserver的稳定性非常高。原因有二: 1. nameserver互相独立,彼此没有通信关系,单台nameserver挂掉,不影响其他nameserver,即使全部挂掉,也不影响业务系统使用。无状态 2. nameserver不会有频繁的读写,所以性能开销非常小,稳定性很高。
start mqbroker -n 127.0.0.1:9876
四、Broker说明与启动
Broker充当着消息中转角色,负责存储消息、转发消息。Broker在RocketMQ系统中负责接收并存储从 生产者发送来的消息,同时为消费者的拉取请求作准备。Broker同时也存储着消息相关的元数据,包括 消费者组消费进度偏移offset、主题、队列等。
start mqnamesrv
4,1 与NameServer的关系
- 连接
- 单个broker和所有nameserver保持长连接
- 心跳
- 心跳间隔:每隔30秒(此时间无法更改)向所有nameserver发送心跳,心跳包含了自身的topic配置信息。
- 心跳超时:nameserver每隔10秒钟(此时间无法更改),扫描所有还存活的broker连接,若某个连接2分钟内(当前时间与最后更新时间差值超过2分钟,此时间无法更改)没有发送心跳数据,则断开连接。
- 断开
- 时机:broker挂掉;心跳超时导致nameserver主动关闭连接
- 动作:一旦连接断开,nameserver会立即感知,更新topic与队列的对应关系,但不会通知生产者和消费者
4.2. 负载均衡
- 一个topic分布在多个broker上,一个broker可以配置多个topic,它们是多对多的关系。
- 如果某个topic消息量很大,应该给它多配置几个队列?这什么意思,并且尽量多分布在不同broker上,减轻某个broker的压力。
- topic消息量都比较均匀的情况下,如果某个broker上的队列越多,则该broker压力越大。
五、Rocketmq的使用
- 通过@Test进行展示测试结果
1.安装依赖
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.7.5</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 实现对rocketmq的自动装配-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
2.服务执行顺序
-
开始nameserver
start mqnamesrv
-
开启Broker
start mqbroker -n 127.0.0.1:9876
3. 创建微服务
创建两个微服务,一个user微服务用来生产消息,一个order微服务用来消费消息
- 相关配置:
# rocketmq 配置项,对应 RocketMQProperties 配置类
rocketmq:
name-server: 101.133.227.13:9876 # RocketMQ Namesrv
# Producer 配置项
producer:
group: erbadagang-producer-group # 生产者分组
send-message-timeout: 3000 # 发送消息超时时间,单位:毫秒。默认为 3000 。
compress-message-body-threshold: 4096 # 消息压缩阀值,当消息体的大小超过该阀值后,进行消息压缩。默认为 4 * 1024B
max-message-size: 4194304 # 消息体的最大允许大小。。默认为 4 * 1024 * 1024B
retry-times-when-send-failed: 2 # 同步发送消息时,失败重试次数。默认为 2 次。
retry-times-when-send-async-failed: 2 # 异步发送消息时,失败重试次数。默认为 2 次。
retry-next-server: false # 发送消息给 Broker 时,如果发送失败,是否重试另外一台 Broker 。默认为 false
access-key: # Access Key ,可阅读 https://github.com/apache/rocketmq/blob/master/docs/cn/acl/user_guide.md 文档
secret-key: # Secret Key
enable-msg-trace: true # 是否开启消息轨迹功能。默认为 true 开启。可阅读 https://github.com/apache/rocketmq/blob/master/docs/cn/msg_trace/user_guide.md 文档
customized-trace-topic: RMQ_SYS_TRACE_TOPIC # 自定义消息轨迹的 Topic 。默认为 RMQ_SYS_TRACE_TOPIC 。
# Consumer 配置项
consumer:
listeners:
# 配置某个消费分组,是否监听指定 Topic 。结构为 Map<消费者分组, <Topic, Boolean>> 。默认情况下,不配置表示监听。
erbadagang-consumer-group:
topic1: false # 关闭 test-consumer-group 对 topic1 的监听消费
- 如果没有其他配置要求,使用默认配置即可,生产消费都这样配置即可

4. 接收消息
- 注意需要添加这两个注解
@RocketMQMessageListener
@Component
代码示例
@Component
@RocketMQMessageListener(
topic = "主题",consumerGroup = "消费者组名 自定义"
)
public class MQlistener implements RocketMQListener<String> {
@Override
public void onMessage(String msg) {
System.out.println("收到消息:"+msg);
}
}
5.mq发送类型
需要注入RocketMQTemplate
@Autowired
RocketMQTemplate mq;
六、生产消息类型与消费模型与测试
常用的生产消息类型:可靠同步发送、可靠异步发送、单向发送、顺序发送、延迟发送
常用的消费模型分为:集群消费(默认)、广播消费(类似于吃自助餐,每个人花的钱是一样的,吃的东西也是一样的;所有消费者收到的消息是一样的)、顺序消费(顾名思义)
a)发送消息类型
1. 可靠同步发送
- 同步发送是指消息发送方发出数据后,会在收到接收方发回响应之后才会发送下一个数据包的通讯方式。
- 此种方式应用场景非常广泛,例如重要通知邮件、报名短信通知、营销短信系统等。
// 该方式发送的消息是无序的,默认有4个队列,分别进行存储所以是无序的
for (int i = 0; i < 10; i++) {
Message<String> msg = MessageBuilder.withPayload("你好" + i).build();
// 主题、消息(参数) order关联接受消息的topic
SendResult result = mq.syncSend("order", msg);
System.out.println(result);
}
1.1 接受消息演示(以默认的集群消费进行演示)
- OrderMQListener 类实现RocketMQListener接口,设置返回类型为String
- topic 监听的消息主题 必须参数(重要)
- consumerGroup 消费者组 组名 自定义 作用 :集群消费时同一个组名才能集群(重要)
package com.zking.mq;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
@Component
@RocketMQMessageListener(
topic = "order",
consumerGroup = "orderGroup",
)
public class OrderMQListener implements RocketMQListener<String> {
@Override
// 当接受到消息,就会自动调用执行
// 这里可以注入业务信息 来完成要做的事情
public void onMessage(String s) {
System.out.println("订单接受到消息"+s);
}
}

2.可靠异步发送
- 异步发送是指发送方发出数据后,不等接收方发回响应,接着发送下一个数据包的通讯方式。发送方通过回调接口接收服务器响应,并对响应结果进行处理。
@Test
public void 可靠异步发送() throws InterruptedException {
for (int i = 0; i < 10; i++) {
Message<String> msg = MessageBuilder.withPayload("你好" + i).build();
// 主题、消息(参数)
mq.asyncSend("order", msg, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("发送成功"+sendResult);
}
@Override
public void onException(Throwable throwable) {
System.out.println("发送失败");
}
});
Thread.sleep(1000);
}
}
2.1 接受消息演示


3.单向发送
-
单向发送是指发送方只负责发送消息,不等待服务器回应,且没有回调函数触发。即只发送请求而不管响应。
-
适用于某些耗时非常短,但对可靠性要求并不高的场景,例如日志收集。
@Test
public void 单项发送() {
this.mq.sendOneWay("test-topic","单向发送测试");
}
4.顺序发送
@Test
public void 顺序消费() throws InterruptedException {
for (int i = 1005; i < 1010; i++) {
Message<String> msg1 = MessageBuilder.withPayload("订单" + i + "创建").build();
SendResult result = mq.syncSendOrderly("order", msg1, "订单" + i);
System.out.println(result);
Message<String> msg2 = MessageBuilder.withPayload("订单" + i + "修改").build();
SendResult result1 = mq.syncSendOrderly("order", msg2, "订单" + i);
System.out.println(result1);
Thread.sleep(1000);
}
}
4.1 接受消息演示
- 发送消息

- 接受消息(先创建再修改,是按顺序的,不会出现乱序现象)

5.延迟发送
- mq.syncSend("sms",msg,1000,3); 解释
- sms:: 关系到哪儿个消费者;
- msg :传入的参数
- 1000:超时时间
- 3:延迟发送等级
延迟发送等级表,最多只能延迟两个小时(1-18级对应表)
1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
@Test
public void 延迟消息() {
Long start = System.currentTimeMillis();
Message<Long> msg = MessageBuilder.withPayload(start).build();
// timeout超市时间,如果达到改时间就放弃发送消息
mq.syncSend("sms",msg,1000,3);
}
5.1 接受消息演示
@Component
@RocketMQMessageListener(
topic = "sms",consumerGroup = "smsGroup"
)
public class SmsMQListener implements RocketMQListener<Long> {
@Override
public void onMessage(Long s) {
long time = System.currentTimeMillis();
System.out.println("延迟消息 - 发送到执行时长为"+(time- s)/1000);
}
}

1.集群消费
-
topic :监听的消息主题 必须参数
-
consumerGroup: 消费者组 组名 自定义 作用 :集群消费时同一个组名才能集群
-
messageModel:消息模型,默认为集群
@Component
@RocketMQMessageListener(
topic = "order",
consumerGroup = "orderGroup",
)
2.广播消费
@Component
@RocketMQMessageListener(
topic = "order",
consumerGroup = "orderGroup",
messageModel = MessageModel.BROADCASTING // 广播消费
)
3.顺序消费
@Component
@RocketMQMessageListener(
topic = "order",
consumerGroup = "orderGroup",
consumeMode = ConsumeMode.ORDERLY // 顺序消费
)