1.RocketMQ简介
官网: http://rocketmq.apache.org/
RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发,RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。
具有以下特点:
-
l能够保证严格的消息顺序
-
l提供丰富的消息拉取模式
-
l高效的订阅者水平扩展能力
-
l实时的消息订阅机制
-
l亿级消息堆积能力
2.为什么要使用MQ
1,要做到系统解耦,当新的模块进来时,可以做到代码改动最小; 能够解耦
2,设置流程缓冲池,可以让后端系统按自身吞吐能力进行消费,不被冲垮; 能够削峰,限流
3,强弱依赖梳理能把非关键调用链路的操作异步化并提升整体系统的吞吐能力;能够异步
Mq的作用 削峰限流 异步 解耦合
2.1 定义
中间件(缓存中间件 redis memcache 数据库中间件 mycat canal 消息中间件mq )
面向消息的中间件(message-oriented middleware0) MOM能够很好的解决以上的问题。
是指利用高效可靠的消息传递机制进行与平台无关(跨平台)的数据交流,并基于数据通信来进行分布式系统的集成。
通过提供消息传递和消息排队模型在分布式环境下提供应用解耦,弹性伸缩,冗余存储,流量削峰,异步通信,数据同步等
大致流程
发送者把消息发给消息服务器,消息服务器把消息存放在若干队列/主题中,在合适的时候,消息服务器会把消息转发给接受者。在这个过程中,发送和接受是异步的,也就是发送无需等待,发送者和接受者的生命周期也没有必然关系在发布pub/订阅sub模式下,也可以完成一对多的通信,可以让一个消息有多个接受者[微信订阅号就是这样的]
2.2 特点
2.2.1 异步处理模式
消息发送者可以发送一个消息而无需等待响应。消息发送者把消息发送到一条虚拟的通道(主题或队列)上;
消息接收者则订阅或监听该通道。一条信息可能最终转发给一个或多个消息接收者,这些接收者都无需对消息发送者做出回应。整个过程都是异步的。
案例:
也就是说,一个系统和另一个系统间进行通信的时候,假如系统A希望发送一个消息给系统B,让它去处理,但是系统A不关注系统B到底怎么处理或者有没有处理好,所以系统A把消息发送给MQ,然后就不管这条消息的“死活” 了,接着系统B从MQ里面消费出来处理即可。至于怎么处理,是否处理完毕,什么时候处理,都是系统B的事,与系统A无关。
这样的一种通信方式,就是所谓的“异步”通信方式,对于系统A来说,只要把消息发给MQ,然后系统B就会异步处去进行处理了,系统A不能“同步”的等待系统B处理完。这样的好处是什么呢?解耦
2.2.2 应用系统的解耦
发送者和接收者不必了解对方,只需要确认消息
发送者和接收者不必同时在线
2.2.3 现实中的业务
3.各个MQ产品的比较
4.RocketMQ重要概念【重点】
Producer:消息的发送者,生产者;举例:发件人
Consumer:消息接收者,消费者;举例:收件人
Broker:暂存和传输消息的通道;举例:快递
NameServer:管理Broker;举例:各个快递公司的管理机构 相当于broker的注册中心,保留了broker的信息
Queue:队列,消息存放的位置,一个Broker中可以有多个队列
Topic:主题,消息的分类
ProducerGroup:生产者组
ConsumerGroup:消费者组,多个消费者组可以同时消费一个主题的消息
消息发送的流程是,Producer询问NameServer,NameServer分配一个broker 然后Consumer也要询问NameServer,得到一个具体的broker,然后消费消息
5.生产和消费理解【重点】
6.RocketMQ安装
了解了mq的基本概念和角色以后,我们开始安装rocketmq,建议在linux上
6.1 下载RocketMQ
下载地址:https://rocketmq.apache.org/dowloading/releases/
注意选择版本,这里我们选择4.9.2的版本,后面使用alibaba时对应
下载地址:
https://archive.apache.org/dist/rocketmq/4.9.2/rocketmq-all-4.9.2-bin-release.zip
6.2 上传服务器
在root目录下创建文件夹
mkdir rocketmq
将下载后的压缩包上传到阿里云服务器或者虚拟机中去
6.3 解压
unzip rocketmq-all-4.9.2-bin-release.zip
如果你的服务器没有unzip命令,则下载安装一个
yum install unzip
目录分析
Benchmark:包含一些性能测试的脚本;
Bin:可执行文件目录;
Conf:配置文件目录;
Lib:第三方依赖;
LICENSE:授权信息;
NOTICE:版本公告;
6.4 配置环境变量
vi /etc/profile
在文件末尾添加
export NAMESRV_ADDR=阿里云公网IP:9876
刷新环境变量
source /etc/profile
6.5 修改nameServer的运行脚本
进入bin目录下,修改runserver.sh文件,将71行和76行的Xms和Xmx等改小一点
vi runserver.sh
保存退出
6.6 修改broker的运行脚本
进入bin目录下,修改runbroker.sh文件,修改67行
保存退出
6.7 修改broker的配置文件
进入conf目录下,修改broker.conf文件
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
namesrvAddr=localhost:9876
autoCreateTopicEnable=true
brokerIP1=阿里云公网IP
添加参数解释
namesrvAddr:nameSrv地址 可以写localhost因为nameSrv和broker在一个服务器
autoCreateTopicEnable:自动创建主题,不然需要手动创建出来
brokerIP1:broker也需要一个公网ip,如果不指定,那么是阿里云的内网地址,我们再本地无法连接使用
6.8 启动
首先在安装目录下创建一个logs文件夹,用于存放日志
mkdir logs
一次运行两条命令
启动nameSrv
nohup sh bin/mqnamesrv > ./logs/namesrv.log &
启动broker 这里的-c是指定使用的配置文件
nohup sh bin/mqbroker -c conf/broker.conf > ./logs/broker.log &
查看启动结果
6.9 RocketMQ控制台的安装RocketMQ-Console
Rocketmq 控制台可以可视化MQ的消息发送!
旧版本源码是在rocketmq-external里的rocketmq-console,新版本已经单独拆分成dashboard
网址: https://github.com/apache/rocketmq-dashboard
下载地址:
https://github.com/apache/rocketmq-dashboard/archive/refs/tags/rocketmq-dashboard-1.0.0.zip
下载后解压出来,在跟目录下执行
mvn clean package -Dmaven.test.skip=true
将jar包上传到服务器上去
然后运行
nohup java -jar ./rocketmq-dashboard-1.0.0.jar > ./rocketmq-4.9.2/logs/dashboard.log &
命令拓展:–server.port指定运行的端口
–rocketmq.config.namesrvAddr=127.0.0.1:9876 指定namesrv地址
访问: http://localhost:8001
运行访问端口是8001,如果从官网拉下来打包的话,默认端口是8080
nohup java -jar rocketmq-dashboard-1.0.0.jar --server.port=8081 --rocketmq.config.namesrvAddr=47.100.238.122:9876 > rocketmq-dashboard.log &
7.RocketMQ安装之docker
7.1 下载RockerMQ需要的镜像
docker pull rocketmqinc/rocketmq
docker pull styletang/rocketmq-console-ng
7.2 启动NameServer服务
7.2.1 创建NameServer数据存储路径
mkdir -p /home/rocketmq/data/namesrv/logs /home/rocketmq/data/namesrv/store
7.2.2 启动NameServer容器
docker run -d --name rmqnamesrv -p 9876:9876 -v /home/rocketmq/data/namesrv/logs:/root/logs -v /home/rocketmq/data/namesrv/store:/root/store -e “MAX_POSSIBLE_HEAP=100000000” rocketmqinc/rocketmq sh mqnamesrv
7.3 启动Broker服务
7.3.1 创建Broker数据存储路径
mkdir -p /home/rocketmq/data/broker/logs /home/rocketmq/data/broker/store
7.3.2 创建conf配置文件目录
mkdir /home/rocketmq/conf
7.3.3 在配置文件目录下创建broker.conf配置文件
# 所属集群名称,如果节点较多可以配置多个
brokerClusterName = DefaultCluster
#broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = broker-a
#0表示Master,大于0表示不同的slave
brokerId = 0
#表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
#在磁盘上保留消息的时长,单位是小时
fileReservedTime = 48
#有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
brokerRole = ASYNC_MASTER
#刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
flushDiskType = ASYNC_FLUSH
# 设置broker节点所在服务器的ip地址
brokerIP1 = 你服务器外网ip
7.3.4 启动Broker容器
docker run -d --name rmqbroker --link rmqnamesrv:namesrv -p 10911:10911 -p 10909:10909 -v /home/rocketmq/data/broker/logs:/root/logs -v /home/rocketmq/data/broker/store:/root/store -v /home/rocketmq/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf --privileged=true -e "NAMESRV_ADDR=namesrv:9876" -e "MAX_POSSIBLE_HEAP=200000000" rocketmqinc/rocketmq sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf
7.4 启动控制台
docker run -d --name rmqadmin -e "JAVA_OPTS=-Drocketmq.namesrv.addr=你的外网地址:9876 \
-Dcom.rocketmq.sendMessageWithVIPChannel=false \
-Duser.timezone='Asia/Shanghai'" -v /etc/localtime:/etc/localtime -p 9999:8080 styletang/rocketmq-console-ng
7.5 正常启动后的docker ps
7.6 访问控制台
http://你的服务器外网ip:9999/
8.RocketMQ快速入门
RocketMQ提供了发送多种发送消息的模式,例如同步消息,异步消息,顺序消息,延迟消息,事务消息等,我们一一学习
8.1 消息发送和监听的流程
我们先搞清楚消息发送和监听的流程,然后我们在开始敲代码
8.1.1 消息生产者
1.创建消息生产者producer,并制定生产者组名
2.指定Nameserver地址
3.启动producer
4.创建消息对象,指定主题Topic、Tag和消息体等
5.发送消息
6.关闭生产者producer
8.1.2 消息消费者
1.创建消费者consumer,制定消费者组名
2.指定Nameserver地址
3.创建监听订阅主题Topic和Tag等
4.处理消息
5.启动消费者consumer
8.2 搭建Rocketmq-demo
8.2.1 加入依赖
<dependencies>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.9.2</version>
<!--docker的用下面这个版本-->
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
8.2.2 编写生产者
/**
* 测试生产者
*
* @throws Exception
*/
@Test
public void testProducer() throws Exception {
// 创建默认的生产者
DefaultMQProducer producer = new DefaultMQProducer("test-group");
// 设置nameServer地址
producer.setNamesrvAddr("localhost:9876");
// 启动实例
producer.start();
for (int i = 0; i < 10; i++) {
// 创建消息
// 第一个参数:主题的名字
// 第二个参数:消息内容
Message msg = new Message("TopicTest", ("Hello RocketMQ " + i).getBytes());
SendResult send = producer.send(msg);
System.out.println(send);
}
// 关闭实例
producer.shutdown();
}
8.2.3 编写消费者
/**
* 测试消费者
*
* @throws Exception
*/
@Test
public void testConsumer() throws Exception {
// 创建默认消费者组
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer-group"