背景
可靠性最终一致性事物方案,保证正确处理,正确传递
应用的场景:模块与模块的异步调用
一 安装
1.先安装JDK8
2.解压文件
tar -xf jdk-8u212-linux-x64.tar.gz -C /usr/local/
cd /usr/local
3.配置环境变量
vim /etc/profile
# 在文件末尾添加以下内容:
export JAVA_HOME=/usr/local/jdk1.8.0_212
export PATH=$JAVA_HOME/bin:$PATH
立即生效:source /etc/profile
4.安装RockerMQ
4.1下载rockerMQ
wget https://mirror.bit.edu.cn/apache/rocketmq/4.7.0/rocketmq-all-4.7.0-bin-release.zip
4.2 解压 RockerMQ
unzip rocketmq-all-4.7.0-bin-release.zip -d /usr/local/
4.3# 修改一下文件夹名,改成 rocketmq 方便使用
mv /usr/local/rocketmq-all-4.7.0-bin-release /usr/local/rocketmq
4.4 配置环境变量 ROCKETMQ_HOME 和 PATH
vim /etc/profile
# 在文件末尾添加以下内容: export ROCKETMQ_HOME=/usr/local/rocketmq export PATH=$ROCKETMQ_HOME/bin:$PATH
修改完后, 让环境变量立即生效
source /etc/profile
4.5 减小 rocketmq 使用的内存
修改 name server
内存改为 256m(注册中心,满足自己的注册中心)
cd /usr/local/rocketmq/
# 编辑 bin/runserver.sh
vim bin/runserver.sh
# 找到文件中下面这一行:
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
# 将 -Xms4g -Xmx4g -Xmn2g 修改为 -Xms256m -Xmx256m -Xmn128m
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
4.6 修改 broker
内存改为 256m(收发消息,消息中间件)
# 编辑 bin/runbroker.sh
vim bin/runbroker.sh
# 找到文件中下面这一行:
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
# 将 -Xms8g -Xmx8g -Xmn4g 修改为 -Xms256m -Xmx256m -Xmn128m
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"
5.启动 rocketmq
5.1 先启动 name server
# 进入 rocketmq 目录
cd /usr/local/rocketmq/
# 启动 name server
nohup sh bin/mqnamesrv &
# 查看运行日志, 看到"The Name Server boot success."表示启动成功
tail -f ~/logs/rocketmqlogs/namesrv.log
5.2在启动brocker
# 启动 broker, 连接name server: localhost:9876
nohup sh bin/mqbroker -n localhost:9876 &
# 查看运行日志, 看到"The broker[......:10911] boot success."表示启动成功
tail -f ~/logs/rocketmqlogs/broker.log
6.关闭防火墙
# 关闭防火墙
systemctl stop firewalld.service
# 禁止防火墙开机启动
systemctl disable firewalld.service
7.RocketMQ 的关闭命令
关闭broker mqshutdown broker
关闭nameserver mqshutdown namesrv
8.管理界面的搭建
8.1. 克隆项目
cd /usr/local/rocketmq/
# 克隆 rocketmq-externals 项目
git clone https://gitee.com/mirrors/RocketMQ-Externals
8.2 maven打包管理界面项目
如果没有安装 maven, 请先执行 maven 安装命令
yum install -y maven
打包管理界面项目 rocketmq-console
.
打包过程中会下载各种依赖,比较缓慢,请耐心等待
# 进入管理界面项目的文件夹
cd RocketMQ-Externals/rocketmq-console
# 执行maven 打包命令, 执行时间较长, 请耐心等待
mvn clean package -Dmaven.test.skip=true
8.3运行启动管理界面
# 进入 target 目录
cd target
# 运行管理界面
nohup java -jar rocketmq-console-ng-1.0.1.jar --server.port=8080 --rocketmq.config.namesrvAddr=localhost:9876 &
访问管理界面:
二 RocketMQ 基本原理
生产者的负载均衡
生产者以轮询的方式向所有写队列发送消息,这些队列可能会分布在多个broker实例上。
消费者的负载均衡
读取队列
被均匀分配给这些消费者,它们从指定的队列来接收消息。队列的分配可以采用不同的策略:
1.AllocateMessageQueueAveragely 平均分配
这是默认策略,它是这样分配队列的:
2.AllocateMessageQueueAveragelyByCircle 环形分配
如果使用环形分配,在消费者的代码中需要设置分配策略
consumer.setAllocateMessageQueueStrategy(new AllocateMessageQueueAveragelyByCircle());
这种分配策略的逻辑很简单,所有0号队列分给0号消费者,所有1号队列分给1号消费者,以此类推。(安照下标相同的方式)
3.AllocateMessageQueueConsistentHash 一致性哈希
如果使用一致性哈希算法进行分配,在消费者的代码中需要设置分配策略
consumer.setAllocateMessageQueueStrategy(new AllocateMessageQueueConsistentHash());
三 RockerMQ 原生API接收发信息
1.需要的pom依赖:
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-store</artifactId>
<version>4.7.1</version>
</dependency>
2.同步消息模式:
同步消息发送要保证强一致性,发到master的消息向slave复制后,才会向生产者发送反馈信息。
这种可靠性同步地发送方式使用的比较广泛,比如:重要的消息通知,短信通知。(同步就是等待)
3.异步消息
master收到消息立即向生产者反馈,之后在用异步的方式向slave复制消息。异步消息通常用着消息反应灵敏的业务场景,即发送端不能容忍长时间等待Brocker响应。
4.单向消息
这种方式主要用在不特别关心发送结果和场景, 例如日志发送
5.顺序消息
- 同一组有序的消息序列,会被发送到同一个队列,按照 FIFO 的方式进行处理
- 一个队列只允许一个消费者线程接收消息,这样就保证消息按顺序被接收
生产者发送消息,把消息发到同一个队列用简单的取余(队列选择器接口)
消费者只能启动用一个线程处理消息
6.延时消息
息发送到 Rocketmq 服务器后, 延迟一定时间再向消费者进行投递。
使用的场景: 电商提交订单,一直不付款,1小时后自动取消。
7.批量消息
批量发送消息能显著提高传递小消息的性能。限制是这些批量消息应该有相同的topic,相同的waitStoreMsgOK,而且不能是延时消息。此外,这一批消息的总大小不应超过4MB。
8.事务消息
-
发送半消息(半消息不会发送给消费者)
-
执行本地事务
-
提交消息
完成事务消息发送后,消费者就可以以正常的方式来消费数据。
RocketMQ 的自动重发机制在绝大多数情况下,都可以保证消息被正确消费。
假如消息最终消费失败了,还可以由人工处理进行托底。
在看下错误的情况
-
事务执行失败时回滚消息
-
服务器无法得知消息状态时,需要主动回查消息状态