目录
RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发,在阿里内部,RocketMQ承接了例如“双11”等高并发场景的消息流转,能够处理万亿级别的消息。
RocketMQ各个角色介绍
-
Producer:消息的发送者;举例:发信者
-
Consumer:消息接收者;举例:收信者
-
Broker:暂存和传输消息;举例:邮局
-
NameServer:管理Broker;举例:各个邮局的管理机构
-
Topic:区分消息的种类;一个发送者可以发送消息给一个或者多个Topic;一个消息的接收者可以订阅一个或者多个Topic消息
-
Message Queue:相当于是Topic的分区;用于并行发送和接收消息
准备工作
我们在这里下载二进制版本的文件,也就是zip包,以linux为例,必备环境有:
- Linux64位系统
- JDK1.8(64位)
JDK安装(已搭建可跳过)
以jdk-8u221-linux-x64.tar.gz为例,下载好后先将其拷贝至服务器,然后创建想要存放的文件夹(位置自拟)
mkdir /opt/java
# 笔者的jdk放在software里,将其拷贝过来
cp /opt/software/jdk-8u221-linux-x64.tar.gz /opt/java
cd /opt/java
解压jdk,完成后会在当前目录下生成jdk1.8.0_221文件夹
tar -zxvf jdk-8u211-linux-x64.tar.gz
# 解压之后删除jdk包(不删也行,笔者是因为software里有)
rm -f jdk-8u211-linux-x64.tar.gz
设置环境变量,这一步的目的是使linux全局都能使用jdk里的命令,不需要进到相应目录里
vim /etc/profile
# 添加以下内容,注意路径对应你的安装路径
export JAVA_HOME=/opt/java/jdk1.8.0_221
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
# 执行下方命令使得环境变量立刻生效
source /etc/profile
测试,成功显示jdk版本则表示成功
RocketMQ安装
以rocketmq-all-4.5.2-bin-release.zip为例,拷贝至服务器,创建要存放的目录
mkdir /opt/rocketmq
cp /opt/software/rocketmq-all-4.5.2-bin-release.zip /opt/rocketmq
cd /opt/rocketmq
解压rocketmq二进制文件
# 安装unzip
yum install unzip
# 解压
unzip rocketmq-all-4.5.2-bin-release.zip
# 删除压缩包
rm -f rocketmq-all-4.5.2-bin-release.zip
完成后,可以看到生成了rocketmq-all-4.5.2-bin-release文件夹,打开能够看见以下几个目录
-
benchmark:一些demo,方便测试
-
bin:启动脚本,包括shell脚本和CMD脚本
-
conf:实例配置文件 ,包括broker配置文件、logback配置文件等
-
lib:依赖jar包,包括Netty、commons-lang、FastJSON等
启动RocketMQ
建议先修改两个配置文件,因为RocketMQ默认使用的JVM内存很大,可能导致启动失败,都是以后台方式启动。
# 进入RocketMQ的bin目录
cd /opt/rocketmq/rocketmq-all-4.5.2-bin-release/bin/
# 编辑runbroker.sh和runserver.sh修改默认JVM大小
vim runbroker.sh
vim runserver.sh
# 参考设置
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
1、启动NameServer
# 1.进入bin目录,如果将rocketmq配置到环境变量了就不需要
cd /opt/rocketmq/rocketmq-all-4.5.2-bin-release/bin/
# 2.启动NameServer,后台启动方式
nohup sh mqnamesrv &
# 3.查看启动日志
tail -f ~/logs/rocketmqlogs/namesrv.log
执行时会出现nohup: ignoring input and appending output to ‘nohup.out’这样的信息,直接回车就行,查看日志时,看到下图信息则表示NameServer启动成功
或者使用jps命令查看当前正在运行的java程序里有无NameServer
2、启动Broker
# 1.启动Broker,-n代表指定Broker要连接的NameServer(默认端口9876)
nohup sh mqbroker -n localhost:9876 &
# 2.查看启动日志
tail -f ~/logs/rocketmqlogs/broker.log
查看日志,出现以下信息代表启动成功
查看jps
3、关闭RocketMQ
先关Broker,再关NameServer
# 1.关闭NameServer
sh bin/mqshutdown namesrv
# 2.关闭Broker
sh bin/mqshutdown broker
测试RocketMQ
需打开两个连接服务器的窗口,一个执行生产者脚本,另一个执行消费者脚本
生产者
# 1.设置环境变量
export NAMESRV_ADDR=localhost:9876
# 2.使用安装包的Demo发送消息(需要进入bin目录)
sh tools.sh org.apache.rocketmq.example.quickstart.Producer
消费者
# 1.设置环境变量
export NAMESRV_ADDR=localhost:9876
# 2.接收消息
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer
查看现象会发现,生产者发出的消息,都被消费者接收了,代表RocketMQ生效了
# 生产者打印
SendResult [sendStatus=SEND_OK, msgId=AC1353A428356FF3C5B5028DCCEB03E3, offsetMsgId=AC1353A400002A9F0000000000083892, messageQueue=MessageQueue [topic=TopicTest, brokerName=izuf6gvuc5k1i27heipwewz, queueId=2], queueOffset=748]
SendResult [sendStatus=SEND_OK, msgId=AC1353A428356FF3C5B5028DCCED03E4, offsetMsgId=AC1353A400002A9F0000000000083946, messageQueue=MessageQueue [topic=TopicTest, brokerName=izuf6gvuc5k1i27heipwewz, queueId=3], queueOffset=749]
SendResult [sendStatus=SEND_OK, msgId=AC1353A428356FF3C5B5028DCCEE03E5, offsetMsgId=AC1353A400002A9F00000000000839FA, messageQueue=MessageQueue [topic=TopicTest, brokerName=izuf6gvuc5k1i27heipwewz, queueId=0], queueOffset=749]
SendResult [sendStatus=SEND_OK, msgId=AC1353A428356FF3C5B5028DCCEF03E6, offsetMsgId=AC1353A400002A9F0000000000083AAE, messageQueue=MessageQueue [topic=TopicTest, brokerName=izuf6gvuc5k1i27heipwewz, queueId=1], queueOffset=749]
# 消费者打印
ConsumeMessageThread_16 Receive New Messages: [MessageExt [queueId=0, storeSize=180, queueOffset=606, sysFlag=0, bornTimestamp=1572580446202, bornHost=/172.19.83.164:56686, storeTimestamp=1572580446203, storeHost=/172.19.83.164:10911, msgId=AC1353A400002A9F000000000006A7CA, commitLogOffset=436170, bodyCRC=1150532008, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=750, CONSUME_START_TIME=1572580468463, UNIQ_KEY=AC1353A428356FF3C5B5028DC7FA01A9, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 52, 50, 53], transactionId='null'}]]
ConsumeMessageThread_19 Receive New Messages: [MessageExt [queueId=1, storeSize=180, queueOffset=612, sysFlag=0, bornTimestamp=1572580446263, bornHost=/172.19.83.164:56686, storeTimestamp=1572580446264, storeHost=/172.19.83.164:10911, msgId=AC1353A400002A9F000000000006B95E, commitLogOffset=440670, bodyCRC=2075712480, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=750, CONSUME_START_TIME=1572580468487, UNIQ_KEY=AC1353A428356FF3C5B5028DC83701C2, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 52, 53, 48], transactionId='null'}]]
ConsumeMessageThread_18 Receive New Messages: [MessageExt [queueId=1, storeSize=180, queueOffset=611, sysFlag=0, bornTimestamp=1572580446257, bornHost=/172.19.83.164:56686, storeTimestamp=1572580446258, storeHost=/172.19.83.164:10911, msgId=AC1353A400002A9F000000000006B68E, commitLogOffset=439950, bodyCRC=197152660, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=750, CONSUME_START_TIME=1572580468487, UNIQ_KEY=AC1353A428356FF3C5B5028DC83101BE, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 52, 52, 54], transactionId='null'}]]
ConsumeMessageThread_1 Receive New Messages: [MessageExt [queueId=1, storeSize=180, queueOffset=610, sysFlag=0, bornTimestamp=1572580446251, bornHost=/172.19.83.164:56686, storeTimestamp=1572580446252, storeHost=/172.19.83.164:10911, msgId=AC1353A400002A9F000000000006B3BE, commitLogOffset=439230, bodyCRC=212700045, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=750, CONSUME_START_TIME=1572580468487, UNIQ_KEY=AC1353A428356FF3C5B5028DC82B01BA, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 52, 52, 50], transactionId='null'}]]