一、前言
1、为什么要用MQ
-
应用解耦
系统耦合性越低,容错性越高 -
流量消峰
将用户的请求缓存到MQ中,之后再将这些请求分波处理 -
异步处理,提高用户体验
2、MQ的优缺点
- 系统可用性降低
(MQ是微服务与微服务沟通的通道,如果MQ挂了那么整个系统都会崩溃)(解决:方案可以使用集群提高可以性,主从复制。生产消费分离)系统引入的外部依赖越多,越容易挂掉。本来你就是 A 系统调用 BCD 三个系统的接口就好了,ABCD 四个系统还好好的,没啥问题,你偏加个 MQ 进来,万一 MQ 挂了咋整?MQ 一挂,整套系统崩溃,你不就完了?如何保证消息队列的高可用,可以点击这里查看。 - 系统复杂度提高
硬生生加个 MQ 进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已。 - 一致性问题
A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。
3、主流MQ

二、安装RocketMQ
1、下载
- 安装分两种:一种是没用编译过的zip、一种是编译过的zip
没用编译过的需要安装Maven进行编译安装,比较复杂,这里使用二进制安装包(也就是编译过的)。 - 下载地址
上官网下载RocketMQ(Binary:rocketmq-all-4.4.0-bin-release.zip):
跳转
经过访问官网得到以下下载链接
源码(未编译版):
https://archive.apache.org/dist/rocketmq/4.4.0/rocketmq-all-4.4.0-source-release.zip
二进制(编译版):
https://archive.apache.org/dist/rocketmq/4.4.0/rocketmq-all-4.4.0-bin-release.zip
- 使用wget命令下载到linux
这种方式巨慢,建议在官网下载后通过Xftp 这种工具传到linux
[root@iz2zedg4ylq9iqtwm11wecz tmp]# wget https://archive.apache.org/dist/rocketmq/4.4.0/rocketmq-all-4.4.0-bin-release.zip
--2021-08-29 16:25:50-- https://archive.apache.org/dist/rocketmq/4.4.0/rocketmq-all-4.4.0-bin-release.zip
Resolving archive.apache.org (archive.apache.org)... 138.201.131.134, 2a01:4f8:172:2ec5::2
Connecting to archive.apache.org (archive.apache.org)|138.201.131.134|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12306820 (12M) [application/zip]
Saving to: ‘rocketmq-all-4.4.0-bin-release.zip’
12% [======> ] 1,531,904 8.28KB/s eta 21m 41s
[root@iz2zedg4ylq9iqtwm11wecz tmp]# ls
rocketmq-all-4.4.0-bin-release.zip
2、安装
- 使用unzip 解压安装
unzip rocketmq-all-4.4.0-bin-release.zip
- 配置环境变量
# Linux默认修改环境变量的文件
vim /etc/profile
在profile文件的末尾加入如下命令
#set rocketmq
ROCKETMQ_HOME=/my/rocketMQ/rocketmq-all-4.5.0-bin-release # 换成自己的解压目录
PATH=$PATH:$ROCKETMQ_HOME/bin # bin下有rocketMQ所有的运行指令
export ROCKETMQ_HOME PATH
让环境变量立即生效。
# 注:修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。
source /etc/profile
- 启动
**注意:
1、如果不配置环境变量需要进入bin下启动
2、如果使用阿里云服务器需要放行端口号9876(注册中心nameserver 默认)和10911(Broker默认)、可能还需要放行10909(vip通道)
**
[root@iz2zedg4ylq9iqtwm11wecz bin]# ls
cachedog.sh mqadmin.xml mqbroker.numanode2 mqnamesrv.xml play.sh runserver.sh
cleancache.sh mqbroker mqbroker.numanode3 mqshutdown README.md setcache.sh
cleancache.v1.sh mqbroker.cmd mqbroker.xml mqshutdown.cmd runbroker.cmd startfsrv.sh
mqadmin mqbroker.numanode0 mqnamesrv os.sh runbroker.sh tools.cmd
mqadmin.cmd mqbroker.numanode1 mqnamesrv.cmd play.cmd runserver.cmd tools.sh
[root@iz2zedg4ylq9iqtwm11wecz bin]# pwd
/my/rocketMQ/rocketmq-all-4.4.0-bin-release/bin
- 先修改默认的配置。
[root@iz2zedg4ylq9iqtwm11wecz bin]# vim runserver.sh
# 将默认的内存改小一点,防止内存不够启动失败,改为如下就好
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=3
[root@iz2zedg4ylq9iqtwm11wecz bin]# vim runbroker.sh
# 将默认的内存改小一点,防止内存不够启动失败,改为如下就好
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"
- 启动注册中心
nohup sh mqnamesrv &
# 如果报权限不够,启动失败就用下面的方式
nohup sh mqnamesrv > /dev/null 2>&1 &
# 查看是否启动成功
[root@iz2zedg4ylq9iqtwm11wecz bin]# jps
30112 NamesrvStartup # 有进程号和这个名字表示启动成功
4562 newideas-0.0.1-SNAPSHOT.jar
997
2141 Jps
# 如果为[2]+ Exit 255 nohup sh mqnamesrv > /dev/null 2>&1 表示启动失败
- 方式一:默认的confg启动Broker
# 注意这里如果是阿里云服务器IP地址不要用localhost,要用阿里云提供的外围访问ip
nohup sh mqbroker -n ip:9876 & # ip:9876 是注册中心的地址 ,
[root@iz2zedg4ylq9iqtwm11wecz ~]# jps
30112 NamesrvStartup
4562 newideas-0.0.1-SNAPSHOT.jar
3205 BrokerStartup
997
3371 Jps
- 方式二:指定confg启动
# 注意后面指定broker.conf文件的相对路径要正确。
nohup sh bin/mqbroker -c conf/broker.conf &
- 查看日志
tail -f ~/logs/rocketmqlogs/namesrv.log #监听nameserver日志文件

- 关闭服务
#关闭broker
sh mqshutdown broker
#关闭namesrv
sh mqshutdown namesrv
3、测试
- 发送消息(生产者)
# 1.设置环境变量
export NAMESRV_ADDR=localhost:9876
# 2.使用安装包的Demo发送消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
- 接收消息(消费者)
# 1.设置环境变量
export NAMESRV_ADDR=localhost:9876
# 2.接收消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
4、修改消息默认持久化的目录
持久化目录默认在home下
修改为:
[root@iz2zedg4ylq9iqtwm11wecz rocketmq-all-4.5.0-bin-release]# pwd
/my/rocketMQ/rocketmq-all-4.5.0-bin-release
[root@iz2zedg4ylq9iqtwm11wecz rocketmq-all-4.5.0-bin-release]# mkdir store
[root@iz2zedg4ylq9iqtwm11wecz rocketmq-all-4.5.0-bin-release]# mkdir store/commitlog
[root@iz2zedg4ylq9iqtwm11wecz rocketmq-all-4.5.0-bin-release]# mkdir store/consumequeue
[root@iz2zedg4ylq9iqtwm11wecz rocketmq-all-4.5.0-bin-release]# mkdir store/index
[root@iz2zedg4ylq9iqtwm11wecz rocketmq-all-4.5.0-bin-release]# ls
benchmark bin conf lib LICENSE NOTICE README.md store
[root@iz2zedg4ylq9iqtwm11wecz rocketmq-all-4.5.0-bin-release]# cd store/
[root@iz2zedg4ylq9iqtwm11wecz store]# ls
commitlog consumequeue index
三、安装rocketmq的可视化dashboard(也算是rocketmq的客户端)
安装可视化工具在win(自己电脑,通过本地浏览器访问)上面安装就可以了。
1、下载
地址:https://github.com/apache/rocketmq-externals/releases

2、解压

3、直接用idea打开上面的项目

项目结构

4、添加pom依赖
JAXB,Java Architechture for Xml Binding,用于XML绑定的Java技术,是一个业界标准,是一
项可以根据XML Schema生成Java类的技术。
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
5、修改默认配置

6、运行
运行可以直接运行mian,也可以打包成jar后运行
- 直接运行main

- 在浏览器打开

- 发送消息测试到rocketmq进行测试
1、导入pom依赖
<dependencies>
<!-- 导入rocketmq客户端依赖-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.4.0</version>
</dependency>
</dependencies>
2、运行测试
package com.lihua.rocketmq.producer;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
/**
* 生产者发送同步消息
* @author 15594
*/
public class SyncProducer {
public static void main(String[] args) throws Exception {
//实例化消息生产者producer,group1表示这个生产者属于哪个集群
DefaultMQProducer producer = new DefaultMQProducer("group1");
//注册到注册中心
producer.setNamesrvAddr("39.96.52.225:9876");
//启动producer实例
producer.start();
for (int i = 0; i < 100; i++) {
//创建消息,并指定Topic,Tag和消息体。topic:主题,标志了消息的类型 tags:标签,第二主题,子主题 keys:消息关键词。messagebody:具体的消息内容。
//注意:在rocketmq里面所有消息都必须以二进制传输
Message msg = new Message("TopicTest" , "TagA" , ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
// 发送消息到一个Broker
SendResult sendResult = producer.send(msg);
// 通过sendResult返回消息是否成功送达
System.out.printf("%s%n", sendResult);
}
// 如果不再发送消息,关闭Producer实例。
producer.shutdown();
}
}

// 根据发送的消息的 主题、标签、和消息体可以检索到刚刚发送的消息
Message msg = new Message("TopicTest" , "TagA" , ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));


注意如果报错:
1、可能是网络延迟,可以重新试一下
2、参考这篇文章解决
四、RocketMQ的基本概念
1、NameServer:rockerMQ的注册中心
Name Server的作用类似zookeeper之于kafka,相当于rockerMQ的注册中心,用户注册与发现Broker组件。
2、Broker(消息的中转站)
接受和分发消息的核心组件,也是RocketMQ的核心。Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。(也就是BrokerName相同的为相同集群,BrokerId为0的为主节点,其他未从节点,Master也可以部署多个。
3、Producer(生产者)
Producer 与Name Server集群中的其中一个节点(随机选择,但不同于上一次)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
什么是有状态和无状态
注意:生产者(写)只能与Master建立长连接,消费者(读)可以从Master、Slave建立长连接。相当于读写分离。主节点用于写(插入消息)和读,从节点只能用来读(读取消息)。这样才能保证数据的一致性。因为从节点的数据是从主节点复制而来。只有一个写(当然主节点也能有集群,这样就能并发写)那么就能保证数据的一致性
4、Consumer(消费者)
Consumer与Name Server集群中的其中一个节点(随机选择,但不同于上一次)建立长连接,定期从Name Server 取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定(目前版本没有找到可配置的地方,可以在原码里修改)。
5、Producer Group(生产者集群)
一个Producer Group下包含多个Producer实例,可以是多台机器,也可以是一台机器的多个进程,或者一个进程的多个Producer对象。一个Producer Group可以发送多个Topic消息,Producer Group作用如下:
1.标识一类 Producer
2.可以通过运维工具查询这个发送消息应用下有多个Producer实例
3.发送分布式事务消息时,如果 Producer中途意外宕机,Broker会主动回调 Producer Group内的任意一台机器来确认事务状态。
6、Consumer Group(消费者集群)
用来表示一个消费消息应用,一个Consumer Group下包含多个Consumer实例,可以是多台机器,也可以是多个进程,或者是一个进程的多个Consumer对象。一个Consumer Group下的多个Consumer以均摊方式消费消息,如果设置为广播方式,那么这个 Consumer Group下的每个实例都消费全量数据,集群模式的话,那么只有集群里面的一个消费者实例能消费这个消息。
7、信息消费模式
- 集群:使用相同Group ID的消费者属于同一个集群。同一个集群下的消费者消费逻辑必须完全一致(包括Tag的使用)。更多信息,请参见订阅关系一致。
- 集群消费:当使用集群消费模式时,消息队列RocketMQ版认为任意一条消息只需要被集群内的任意一个消费者处理即可。(相当于以集群为单位进行消费)
- 广播消费:当使用广播消费模式时,消息队列RocketMQ版会将每条消息推送给集群内所有注册过的消费者,保证消息至少被每个消费者消费一次。(相当于以节点为单位进行消费)
8、Message:消息体
Message msg = new Message(topic,tags,keys,messagebody);
消息中主要有四个参数:
-
topic:主题,标志了消息的类型
-
tags:标签,第二主题,子主题
-
keys:消息关键词。
-
messagebody:具体的消息内容
本文详细介绍了如何在Linux上安装RocketMQ,包括下载编译版、配置环境变量、启动服务、消息生产和消费,并讲解了NameServer、Broker、Producer和Consumer等基本概念。还演示了如何安装可视化dashboard和修改消息持久化目录,以及关键概念如消息队列的高可用性和消息模式。
1658

被折叠的 条评论
为什么被折叠?



