1. RocketMQ简介
RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件(阿里的说法是不遵循任何规范的,所以不能完全用JMS的那一套东西来看它),经历了淘宝双十一的洗礼,在功能和性能上据说是远超ActiveMQ。
RocketMQ简介,其中对rocketMQ的历史及特性做了简要的介绍。
这里再分享下,阿里中间技术团队官方博客,其中主要描述的都是概念性的东西,可以帮你更加深入了解RocketMQ的架构以及使用原理。
本文更多的偏向应用方面,描述的是笔者在使用RocketMQ遇到的一些问题。
接下来,开始聊聊RocketMQ的安装过程;参考RocketMQ官方文档。
2. RocketMQ安装
2.1 Linux下安装
2.1.1 安装条件
- 64位JDK 1.8+;
- Maven 3.2.x;
- Git(这里不必须,主要运来获取RocketMQ的压缩包)
2.1.2 发布下载和构建
单击此处下载4.3.0源代码版本。您也可以从这里下载二进制版本。
现在执行以下命令来解压缩4.3.0源代码版本并构建二进制工件。
> unzip rocketmq-all-4.3.0-source-release.zip
> cd rocketmq-all-4.3.0/
> mvn -Prelease-all -DskipTests clean install -U
> cd distribution/target/apache-rocketmq
解压完成之后:apache-rocketmq 目录的结构如下:
主要关注的是bin目录下存放的是启动、停止等一些脚本,conf目录存放配置文件等信息;
对于nameserver和broker日志位置都可以手动配置,具体配置文件就是conf下的logback_broker.xml和logback_namesrv.xml;
这里在conf目录下新增 broker-a.properties
文件
文件内容如下:
#Broker所属哪个集群,默认【DefaultCluster】
terName=DefaultCluster
#本机主机名,需要唯一
brokerName=broker-a
#BrokerId,必须是大等于0的整数,0表示Master,>0表示Slave,一个Master可以挂多个Slave,Master与Slave通过BrokerName来配对,默认【0】
brokerId=0
#删除文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间,默认48小时
fileReservedTime=48
#Broker的角色 - ASYNC_MASTER 异步复制Master - SYNC_MASTER 同步双写Master - SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式 - ASYNC_FLUSH 异步刷盘 - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#Name Server地址 如果是集群方式以;隔开
namesrvAddr=hadoop03:9876
storePathRootDir=/apps/rocketmq/alibaba-rocketmq/store
storePathCommitLog=/apps/rocketmq/alibaba-rocketmq/store/commitlog
#是否允许Broker自动创建Topic,建议线下开启,线上关闭,默认【true】
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
#Broker对外服务的监听端口,默认【10911】
#listenPort=10911
这里的部署主要采用单机部署;更多的集群部署方式见 双写模式部署RocketMQ.
2.1.3 启动namesrv和broker
接下来启动namesrv和broker;
启动namesrv:
> nohup sh bin/mqnamesrv &
> tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
当出现,The Name Server boot success...
时代表启动namesrv成功;
启动broker:
> nohup sh mqbroker -c ../conf/broker-a.properties &
> tail -f ~/logs/rocketmqlogs/broker.log
The broker[%s, 172.30.30.233:10911] boot success...
当出现,The broker[%s, 172.30.30.233:10911] boot success...
代表启动broker成功.
此时可以用jps查询进程:
2.1.4 关闭namesrv和broker
> sh bin/mqshutdown broker
The mqbroker(36695) is running...
Send shutdown request to mqbroker(36695) OK
> sh bin/mqshutdown namesrv
The mqnamesrv(36664) is running...
Send shutdown request to mqnamesrv(36664) OK
坑1:启动了namesrv,但死活启动不了broker.
这个时候用守护进程启动broker,也没有日志,所以此时不要用守护进程启动,直接 ./mqbroker
此时就能看到错误信息,提示你内存大小不足;
在网上找了下原因,才发现坑爹的RocketMQ初始化要求可用内存必须4~8G左右,而我的机器没有那么大的内存。
解决方法:
修改bin 目录下 runserver.sh
和 runbroker.sh
两个文件,修改其中内容如下:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn125m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
主要是修改适合你机器的内存大小;
坑2:brokerIP1配置问题
强制指定本机IP,需要根据每台机器进行修改。官方介绍可为空,系统默认自动识别;但多网卡时IP可能读取错误;
broker自动寻的地址是172.17.0.1,而且深深的刻在了默认配置文件里,虽然我关掉了这个网络,配置文件里还是这个地址,然后我重新写了个配置文件,强制指定broker所在的机器ip为192.168.x.x,重启服务,就大功告成了!
2.2 Windows下安装
安装下载构建和Linux下一致;得到构建后的apache-rocketmq.
进入bin目录下,执行
start mqnamesrv.cmd (弹出的框不要关闭)
start mqbroker.cmd -n 127.0.0.1:9876 (弹出的框不要关闭)
至此就启动完了;
2.3 安装MQ监控平台
2.3.1 下载
github地址,从github上下载源码;
进入到rocketmq-console/src/main/resources目录下,修改application.properties文件
server.contextPath=
server.port=8080
#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
rocketmq.config.namesrvAddr=
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true
主要是配置rocketmq.config.namesrvAddr
地址 ,如果不配置,则默认是localhost:9876
2.3.2 编译
进入到rocketmq-console(pom文件所在目录)下执行
mvn clean package -Dmaven.test.skip=true
注意:不要直接使用mvn package,会提示很多错误
执行完毕后在target目录下会生成一个jar包,执行jar包
java -jar XXX.jar
在浏览器访问:ip:端口(配置的端口),即可。如图: