Spring Boot 集成 RocketMQ

RocketMQ 是一款由阿里巴巴开源的分布式消息中间件,最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型,具备高吞吐、低延迟、高可用和强一致性的特点,适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ 的原理和核心概念的详细介绍,帮助你快速认识和熟悉 RocketMQ。

 1、RocketMQ的安装与启动

在 Windows 中下载安装 RocketMQ,按照以下步骤进行操作:

  • 下载并解压 RocketMQ

Apache RocketMQ 官网 下载最新版本的 RocketMQ 二进制包(Binary 下载)。
将下载的 ZIP 文件解压到您选择的目录,例如 D:\software\rocketmq-all-5.1.4-bin-release

  • 配置 RocketMQ环境变量

安装完成后,配置 ROCKETMQ_HOME 环境变量:

右键点击“此电脑”,选择“属性”。
点击“高级系统设置” -> “环境变量”。
在“系统变量”中点击“新建”,设置 ROCKETMQ_HOME 变量,值为 JDK 的安装路径,例如 D:\software\rocketmq-all-5.1.4-bin-release。
在系统变量中找到 Path,编辑并添加 %ROCKETMQ_HOME%\bin 到 Path 中。

  • 启动 NameServer 和 Broker

RocketMQ 包含两个主要的服务:NameServer 和 Broker。

进入目录:D:\software\rocketmq-all-5.1.4-bin-release\bin

  • 设置namesrv、broker堆栈内存(电脑配置高可以不改)

给namesrv和broker分配内存, 在RocketMQ安装目录下找到bin文件夹(D:\software\rocketmq-all-5.1.4-bin-release\bin),编辑runserver.cmd文件和runbroker.cmd文件

如runbroker.cmd,将默认值2g修改成256m,同时注意一下CLASSPATH

  • 修改runbroker.cmd

  • 修改runserver.cmd

  • 修改rocketmq记录日志地址

namesrv和broker默认日志存储在C盘,空间占用量大,需修改下默认存储路径。

在RocketMQ安装目录下找到conf文件夹(D:\software\rocketmq-all-5.1.4-bin-release\conf)

#两份文件都需增加property标签, 并把所有的user.home全局替换为log.path
<property name="log.path" value="D:/log/rocketmq/" />

修改rmq.broker.logback.xml文件

修改rmq.namesrv.logback.xml文件

  • 启动 NameServer

双击 mqnamesrv.cmd ,启动

  • 启动 Broker

同样在命令提示符中,执行以下命令启动 Broker:

start mqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true,

或新建一个txt文件,将命令保存到文件中,然后再把文件改为.cmd文件,下次可以直接点击启动

  • rocketmq控制台安装及配置

rocketmq-console

进入目录D:\software\rocketmq-console,找到src\main\resources\application.properties。修改

然后,回到D:\software\rocketmq-console,在当前目录打开命令窗口:

执行打包: mvn clean package -Dmaven.test.skip=true

打包完成,打开target

启动执行:java -jar rocketmq-console-ng-1.0.0.jar

2、Rocket的概念与原理

  • 1. 基础概念

Producer(生产者):负责生产消息的角色。Producer 发送消息到 RocketMQ 服务器(Broker),通常有同步、异步和单向发送三种方式。

Consumer(消费者):负责消费消息的角色。Consumer 从 Broker 拉取消息进行处理。消费者分为两种模式:

Push 模式:Broker 主动推送消息给 Consumer。
Pull 模式:Consumer 主动拉取消息。
Broker(消息服务器):核心组件,负责接收、存储和转发消息。Broker 还负责存储消息的元数据、处理生产者发送的消息请求以及消费者的消费请求。

Name Server:RocketMQ 的注册中心,Producer 和 Consumer 通过 Name Server 发现 Broker。Name Server 维护了所有 Broker 的路由信息,并提供名称解析服务。

Topic:消息的逻辑分类标签,Producer 发送消息时指定 Topic,Consumer 根据 Topic 订阅消息。

Tag:消息的二级分类,可以让 Consumer 更细粒度地过滤消息。

Message Queue(消息队列):每个 Topic 由多个消息队列组成,Producer 发送消息时会指定一个或多个队列。Consumer 从队列中拉取消息。

Message(消息):Producer 发送的数据单位。每条消息包含 Topic、Tag、内容、唯一标识符等属性。

Group:Producer 和 Consumer 都可以按照业务逻辑进行分组(Group)。Consumer Group 是多个 Consumer 的集合,这些 Consumer 可以消费同一个 Topic 下的消息。

  • 2. 消息发送与消费流程
  • 2.1 消息发送流程

消息生产:Producer 生成消息并指定目标 Topic。
路由发现:Producer 通过 Name Server 查询 Topic 对应的 Broker 路由信息。
消息发送:Producer 根据路由信息,将消息发送到指定的 Broker。Producer 可以选择同步发送、异步发送或者单向发送。
消息存储:Broker 接收到消息后,将消息存储在本地的 CommitLog 中,同时更新消息的元数据。

  • 2.2 消息消费流程

订阅消息:Consumer 启动时,向 Name Server 注册自己,并订阅感兴趣的 Topic。
路由发现:Consumer 通过 Name Server 获取 Topic 对应的 Broker 信息以及消息队列信息。
拉取消息:Consumer 从 Broker 中拉取消息,并进行消费。消费的位置信息(消费进度)会定期同步到 Broker 端或持久化到本地。
消息处理:Consumer 处理接收到的消息,处理完毕后根据不同的消费模式(自动或手动)确认消息消费完成。

  • 3. 消息存储机制

CommitLog:Broker 将接收到的消息持久化到 CommitLog 文件中,这是 RocketMQ 消息存储的核心文件。消息以追加的方式写入,方便快速写入和批量读取。

ConsumeQueue:消费队列,RocketMQ 为每个 Topic 创建对应的消费队列文件。ConsumeQueue 中存储了指向 CommitLog 的偏移量,用于定位消息内容。

IndexFile:索引文件,用于根据消息的某些字段(如消息 ID、Key)快速检索消息。

RocketMQ 的消息存储分为三个层次:首先是将消息内容存储在 CommitLog 文件中,然后将消息的位置信息存储在 ConsumeQueue 文件中,最后通过 IndexFile 文件提供快速查询功能。

  • 4. 消息可靠性与事务
  • 4.1 消息可靠性

RocketMQ 通过以下机制保证消息的可靠性:

消息确认机制:Producer 发送消息后,需要等待 Broker 的确认。对于消费者,也有消费确认机制,保证消息被成功处理。
消息重试:Consumer 在消费失败时,RocketMQ 会自动进行消息重试,直到消费成功或达到最大重试次数。
消息持久化:Broker 会将消息持久化到磁盘,确保即使 Broker 崩溃,消息数据依然可以恢复。

  • 4.2 事务消息

RocketMQ 支持事务消息,通过“二阶段提交”保证分布式事务的一致性。Producer 在发送事务消息时,首先发送半消息(Prepared Message),执行本地事务,最后根据事务执行结果来提交(Commit)或回滚(Rollback)消息。

  • 5. 消息过滤与顺序消息
  • 5.1 消息过滤

RocketMQ 提供了基于 Tag 的消息过滤功能,可以在消费端只接收特定 Tag 的消息。这减少了 Consumer 不必要的消息处理,提高了消费效率。

  • 5.2 顺序消息

RocketMQ 支持全局顺序消息和部分顺序消息(分区顺序)。全局顺序消息要求所有消息按顺序发送和消费,通常只有一个队列;而分区顺序消息则允许不同分区(队列)中的消息可以并行处理,但同一分区内的消息必须按顺序处理。

  • 6. 高可用性与集群

主从架构(Master-Slave):RocketMQ 支持主从架构,Master 负责处理所有读写请求,Slave 仅用于备份数据。当 Master 故障时,Slave 可以作为备用 Broker 启动,确保数据不丢失。

集群模式(Cluster Mode):支持多种集群模式,如多 Master 模式、Master-Slave 模式。不同集群模式可以根据业务需求灵活配置,以平衡性能、可靠性和可扩展性。

  • 7. 性能优化与监控

性能优化:RocketMQ 提供了多种手段优化性能,如通过多线程并发处理消息、使用异步 IO 提高吞吐量、调节 Producer 的批量发送、优化消息压缩等。

监控与运维:RocketMQ 提供了丰富的监控指标,可以通过 RocketMQ Console 或者集成 Prometheus、Grafana 进行监控。运维人员可以实时监控消息的生产、消费情况以及 Broker 的运行状态。

RocketMQ 是一款功能强大、性能优异的分布式消息中间件,适用于多种业务场景。通过理解其核心概念和原理,你可以更好地在实际项目中应用 RocketMQ。了解消息的发送与消费流程、存储机制、可靠性保障、事务支持、以及顺序消息的处理等方面的知识,将有助于你更高效地使用和管理 RocketMQ 系统。

3、SpringBoot集成RocketMQ

  • 首先,在pom.xml中添加RocketMQ的依赖,具体如下所示:
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>
  • 然后,在application.yml中添加RocketMQ的基本配置:
# RocketMq
rocketmq:
  name-server: 127.0.0.1:9876
  producer:
    group: producer-group
  consumer:
    group: consumer-group
  • 创建消息生产者
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;

@Service
public class RocketMQProducer {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    private final String topic = "demo-topic";

    // 1.同步发送消息
    // 同步发送是指发送方发送一条消息后,会等待服务器返回确认信息后再进行后续操作。这种方式适用于需要可靠性保证的场景。
    public void sendSyncMessage(String message){
        rocketMQTemplate.syncSend(topic, MessageBuilder.withPayload(message).build());
        System.out.printf("同步发送结果: %s\n", message);
    }

    // 2.异步发送消息
    // 异步发送是指发送方发送消息后,不等待服务器返回确认信息,而是通过回调接口处理返回结果。这种方式适用于对响应时间要求较高的场景。
    public void sendAsyncMessage(String message){
        rocketMQTemplate.asyncSend(topic, MessageBuilder.withPayload(message).build(), new SendCallback() {

            @Override
            public void onSuccess(SendResult sendResult) {
                System.out.printf("异步发送成功: %s\n", sendResult);
            }

            @Override
            public void onException(Throwable throwable) {
                System.out.printf("异步发送失败: %s\n", throwable.getMessage());
            }
        });
    }

    // 3.单向发送消息
    // 单向发送是指发送方只负责发送消息,不关心服务器的响应。该方式适用于对可靠性要求不高的场景,如日志收集。
    public void sendOneWayMessage(String message){
        rocketMQTemplate.sendOneWay(topic, MessageBuilder.withPayload(message).build());
        System.out.println("单向消息发送成功");
    }
}
  • 创建消息消费者

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.Service;

@Service
@RocketMQMessageListener(topic = "demo-topic", consumerGroup = "consumer-group", messageModel = MessageModel.CLUSTERING)
public class RocketMQConsumer implements RocketMQListener<String> {

    @Override
    public void onMessage(String s) {
        System.out.printf("收到消息: %s\n", s);
    }
}
  • 测试消息发送

编写一个简单的RocketController控制器,用于触发消息发送!

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RocketController {
    @Autowired
    private RocketMQProducer rocketMQProducer;

    @GetMapping("/sendSync")
    public String sendSync(@RequestParam String message) {
        rocketMQProducer.sendSyncMessage(message);
        return "同步消息发送成功";
    }

    @GetMapping("/sendAsync")
    public String sendAsync(@RequestParam String message) {
        rocketMQProducer.sendAsyncMessage(message);
        return "异步消息发送中";
    }

    @GetMapping("/sendOneWay")
    public String sendOneWay(@RequestParam String message) {
        rocketMQProducer.sendOneWayMessage(message);
        return "单向消息发送成功";
    }
}

启动项目并测试
启动你的 Spring Boot 应用程序,并通过浏览器或工具(如 Postman)访问以下 URL 来测试不同的消息发送方式:

同步发送消息:http://localhost:8080/sendSync?message=sendSyncTest
异步发送消息:http://localhost:8080/sendAsync?message=sendAsyncTest
单向发送消息:http://localhost:8080/sendOneWay?message=sendOneWayTest

或者编写一个测试类用于触发消息发送!

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ProducerTest {
    @Autowired
    private RocketMQProducer rocketMQProducer;

    @Test
    public void ConvertAndSendTest() {
        rocketMQProducer.sendSyncMessage("SendTest");
    }

}

4、rocketmq-console可视化界面,使用指南

  • 语言

  • 主题

CONSUMER 管理,代理者点位、消费者点位、差值(mq积压消息的总数)

  • 查看消息是否被消费

CONSUMED 代表该消息已经被消费

NOT_CONSUME_YET 还没被消费

UNKNOW_EXCEPTION 报错了,可以看日志,一般报错内容会紧跟其后,具体很容易排查出来

NOT_ONLINE 代表该Consumer并没有运行

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunyanchun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值