RocketMQ详细配置与使用

本文介绍了RocketMQ的用途,包括应用解耦、流量削峰和数据分发,并详细讲解了RocketMQ的优缺点,与其他MQ产品的比较。接着,文章通过快速入门教程,指导读者如何安装、启动和测试RocketMQ,以及搭建可视化监控平台。还涵盖了消息发送、消费的多种模式,如同步、异步、批量和延时消息,并讨论了消息的顺序性、高可用性机制、负载均衡和重试策略。最后,文章提到了消费幂等和死信队列的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 MQ介绍

2 为什么要用MQ

消息队列是一种“先进先出”的数据结构在这里插入图片描述其应用场景主要包含以下3个方面

2.1 应用解耦

系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。

在这里插入图片描述

使用消息队列解耦合,系统的耦合性就会提高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统回复后,补充处理存在消息队列中的订单消息即可,终端系统感知不到物流系统发生过几分钟故障。

2.2 流量削峰

在这里插入图片描述
应用系统如果遇到系统请求流量的瞬间猛增,有可能会将系统压垮。有了消息队列可以将大量请求缓存起来,分散到很长一段时间处理,这样可以大大提到系统的稳定性和用户体验。

一般情况,为了保证系统的稳定性,如果系统负载超过阈值,就会阻止用户请求,这会影响用户体验,而如果使用消息队列将请求缓存起来,等待系统处理完毕后通知用户下单完毕,这样总不能下单体验要好。

处于经济考量目的:

业务系统正常时段的QPS如果是1000,流量最高峰是10000,为了应对流量高峰配置高性能的服务器显然不划算,这时可以使用消息队列对峰值流量削峰

2.3 数据分发

在这里插入图片描述

通过消息队列可以让数据在多个系统更加之间进行流通。数据的产生方不需要关心谁来使用数据,只需要将数据发送到消息队列,数据使用方直接在消息队列中直接获取数据即可

在这里插入图片描述

3 MQ的优点和缺点

优点:解耦、削峰、数据分发
缺点包含以下几点:
系统可用性降低
系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。
如何保证MQ的高可用?
系统复杂度提高
MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。
如何保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?
一致性问题
A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败。
如何保证消息数据处理的一致性?

4 各种MQ产品的比较

常见的MQ产品包括Kafka、ActiveMQ、RabbitMQ、RocketMQ。
在这里插入图片描述

5 RocketMQ快速入门

RocketMQ 是阿里巴巴2016年MQ中间件,使用 Java 语言开发,在阿里内部,RocketMQ 承接了例如“双11”等高并发场景的消息流转,能够处理万亿级别的消息。

5.1 准备工作

下载RocketMQ

这里选择的 RocketMQ 的版本:4.6.0
下载地址:下载地址
官方文档:http://rocketmq.apache.org/docs/quick-start/

环境要求

Linux64位系统
JDK1.8(64位)

5.2 安装RocketMQ

安装步骤

我这里是以二进制包方式来安装的:

解压安装包
进入安装目录
目录介绍

bin:启动脚本,包括 shell 脚本和 CMD 脚本
conf:实例配置文件 ,包括 broker 配置文件、logback 配置文件等
lib:依赖 jar 包,包括Netty、commons-lang、FastJSON等

启动RocketMQ

RocketMQ 默认的虚拟机内存较大,启动 Broker 或者 NameServer 可能会因为内存不足而导致失败,所以需要编辑如下两个配置文件,修改 JVM 内存大小

编辑 runbroker.sh 和 runserver.sh 修改默认 JVM 大小
$ vi bin/runbroker.sh
# 参考设置
JAVA_OPT=“${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m”

$ vi bin/runserver.sh
# 参考设置
JAVA_OPT=“${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m”

启动 NameServer
1.启动NameServer nohup sh bin/mqnamesrv &
2.查看启动日志 tail -f ~/logs/rocketmqlogs/namesrv.log

启动 Broker
1.启动Broker nohup sh bin/mqbroker -n localhost:9876 &
2.查看启动日志 tail -f ~/logs/rocketmqlogs/broker.log

bin/mqbroker 的一些可选参数:
-c:指定配置文件路径
-n:NameServer 的地址

5.3 测试RocketMQ

发送消息

设置环境变量 export NAMESRV_ADDR=localhost:9876 #
使用安装包的Demo发送消息 sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

接收消息

设置环境变量 export NAMESRV_ADDR=localhost:9876
接收消息 sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

关闭RocketMQ

关闭NameServer sh bin/mqshutdown namesrv
关闭Broker sh bin/mqshutdown broker

各角色介绍

Producer:消息的发送者;举例:发件者
Consumer:消息接收者;举例:收件人
Consumer Group:消费组;每一个 consumer 实例都属于一个 consumer group,每一条消息只会被同一个 consumer group 里的一个 consumer 实例消费。(不同consumer group可以同时消费同一条消息)
Broker:暂存和传输消息;举例:快递公司
NameServer:管理 Broker;举例:快递公司的管理机构
Topic:区分消息的种类;一个发送者可以发送消息给一个或者多个 Topic;一个消息的接收者可以订阅一个或者多个 Topic 消息
Message Queue:相当于是 Topic 的分区;用于并行发送和接收消息

在这里插入图片描述

broker配置文件详解

broker 默认的配置文件位置在:conf/broker.conf

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

6 可视化监控平台搭建

6.1 概述

RocketMQ 有一个对其扩展的开源项目 incubator-rocketmq-externals,这个项目中有一个子模块叫 rocketmq-console,这个便是管理控制台项目了,先将 incubator-rocketmq-externals 拉到本地,因为我们需要自己对 rocketmq-console 进行编译打包运行。

在这里插入图片描述

6.2下载并编译打包

克隆项目
git clone https://github.com/apache/rocketmq-externals
在 rocketmq-console 中配置 namesrv 集群地址:
$ cd rocketmq-console $ vim src/main/resources/application.properties rocketmq.config.namesrvAddr=10.211.55.4:9876
配置完成进行编译并打包
mvn clean package -Dmaven.test.skip=true
启动 rocketmq-console:
nohup java -jar rocketmq-console-ng-2.0.0.jar > tmp.log &
启动成功后,我们就可以通过浏览器访问 http://IP地址:8080 进入控制台界面了,如下图:

在这里插入图片描述

7 消息发送与消费示例(Maven)

导入MQ客户端依赖
注意:rocketmq-client 的版本,要与 RocketMQ 的版本一致

org.apache.rocketmq rocketmq-client 4.6.0

消息发送者步骤分析:

创建消息生产者 producer,并指定生产者组名
指定 Nameserver 地址
启动 producer
创建消息对象,指定主题 Topic、Tag 和消息体
发送消息
关闭生产者 producer
消息消费者步骤分析:

创建消费者 Consumer,制定消费者组名
指定 Nameserver 地址
订阅主题 Topic 和 Tag
设置回调函数,处理消息
启动消费者 consumer

8基 本样例

8.1消息发送,发送同步消息

这种可靠性同步地发送方式使用的比较广泛,比如:重要的消息通知,短信通知

public class SyncProducer {
	public static void main(String[] args) throws Exception {
    	// 实例化消息生产者Producer
        DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
     	// 设置NameServer的地址
     	producer.setNamesrvAddr("localhost:9876");
     	// 设置消息同步发送失败时的重试次数,默认为 2
        producer.setRetryTimesWhenSendFailed(2);
        // 设置消息发送超时时间,默认3000ms
        producer.setSendMsgTimeout(3000);
    	  // 启动Producer实例
        producer.start();
     	for (int i = 0; i < 100; i++) {
    	       // 创建消息,并指定Topic,Tag和消息体
    	       Message msg = new Message("TopicTest" /* Topic */,
          	"TagA" /* Tag */,
          	("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message 
           body */
         	  );
        	// 发送消息到一个Broker
            SendResult sendResult = producer.send(msg);
            // 通过sendResult返回消息是否成功送达
            System.out.printf("%s%n", sendResult);
    	}
    	// 如果不再发送消息,关闭Producer实例。
    	producer.shutdown();
    }
}

8.3发送异步消息

异步消息通常用在对响应时间敏感的业务场景,即发送端不能容忍长时间地等待Broker的响应。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值