系列文章目录
rocketmq-安装篇(一)
rocketmq-手把手搭建集群模式(二)
rocketmq-各类型消息实战(三)
rocketmq-名词解释(四)
rocketmq-消息存储(五)
文章目录
前言
在实际做项目时,经常遇到跨语言、跨系统、短时高流量、异步处理的问题,传统的方法一般是开个一个中间的服务、缓存、启用多线程来处理种种复杂的问题,处理起来捉襟见肘。而消息队列服务正好可以完美处理系统解耦、削峰、跨平台、异步等需求,有时候也用于数据一致性。
一、mq是什么?
1.1 定义
消息队列-mq:从广义上讲是一种消息队列服务中间件,提供一套完整的信息生产、传递、消费的的软件系统。就像是一个完成的快递系统,通过快递系统可以生产快递(你给内容,他们包装完成的快递)、传递(通过仓库、渠道传递)、消费(放到你们指定的收货地点,如果是签名的,当时就可以确认反馈);整个传递的内容及实时位置,传递状况,快递系统都有留有数据。
1.2 作用
- 1.削峰:当系统流量处在高峰期时,将数据先暂存,利用这个缓冲机制,再慢慢处理。
- 2.解耦:低耦合或者跨系统的业务可以通过mq中转解耦。解耦带来的好处就是:提高系统的可用性、业务完整性
- 3.消息分发:发送消息给多个接收端接收。(异步、数据一致性等)
二、安装部署步骤(单主)
官网英文快速教程:http://rocketmq.apache.org/docs/quick-start/
1.安装环境说明
本文环境:CentOS 7+JDK1.8+maven 3.2.2+RocketMQ 4.2.0
2.下载&安装
1、
Apache 官网下载:直接下载整个 RocketMQ 项目的源码(带source的,也可以直接下载二进制文件[带Binary的],二进制的不需要再编译部署,可以直接使用),如:https://archive.apache.org/dist/rocketmq/4.2.0/rocketmq-all-4.2.0-source-release.zip
直接下载命令:wget https://archive.apache.org/dist/rocketmq/4.2.0/rocketmq-all-4.2.0-source-release.zip
或者本地下载完上传都可以
2、 GitHub 官网下载:因为项目是开源的,所以可以直接从 GitHub 下载整个项目的源码,https://github.com/apache/rocketmq
/*
1、解压缩
2、mvn安装
*/
shell> unzip rocketmq-all-4.2.0-source-release.zip
shell> cd rocketmq-release-4.2.0/
shell> mvn -Prelease-all -DskipTests clean install -U
//真正系统数据都在此目录
shell> cd distribution/target/apache-rocketmq
// 编译后在distribution/target/apache-rocketmq,这个目录可以单独拿出来启动
3.部署服务
3.1启动namesrv、 broker (单主)
注意:先启动nameserv,再启动broker
代码如下:
//启动namesrv,nohup 后台启动
shell>pwd
/usr/local/rocketmq-release-4.2.0/distribution/target/apache-rocketmq
shell> nohup sh bin/mqnamesrv &
//启动broker,nohup 后台启动
shell> nohup sh bin/mqbroker -n localhost:9876 &
//查看java进程是否成功启动
shell> jps
2836 BrokerStartup
2692 NamesrvStartup
2843 Jps
1180 Bootstrap
//log:默认在当前用户目录下 /userHome/logs/rocketmqlogs
*********************************
//配置开机启动,在vi /etc/rc.d/rc.local 中添加下面的启动命令即可
./usr/local/rocketmq-release-4.2.0/distribution/target/apache-rocketmq/bin/mqnamesrv >all.log 2>&1 &
./usr/local/rocketmq-release-4.2.0/distribution/target/apache-rocketmq/bin/mqbroker -n 127.0.0.1:9876 &
此时,简单的rocketmq服务算是启动成功了,namersrv默认端口是9876,可以通过配置修改。
3.2关闭broker, nameserv
注意:与启动顺序相反进行关闭,先关闭 broker、在关闭 nameserv
代码如下:
shell>pwd
/usr/local/rocketmq-release-4.2.0/distribution/target/apache-rocketmq
//关闭broker
shell>sh /bin/mqshutdown broker
//关闭namesrv
shell>sh /bin/mqshutdown namesrv
shell> jps
2843 Jps
1180 Bootstrap
3.3测试发送和接收消息
官网提供了快速测试发送接收消息的例子
发送消息,运行之后会自动发送大量的消息,之后会自动退出,用于测试搭建的测试环境是否可用:
//当前面目录为/usr/local/rocketmq-release-4.2.0/distribution/target/apache-rocketmq
shell>export NAMESRV_ADDR=localhost:9876
shell>sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId=C0A895800C22070DEA4E0844718503DB, offsetMsgId=C0A8958000002A9F000000000004A098, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=2], queueOffset=346]
SendResult [sendStatus=SEND_OK, msgId=C0A895800C22070DEA4E084471AA03DC, offsetMsgId=C0A8958000002A9F000000000004A14C, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=3], queueOffset=346]
SendResult [sendStatus=SEND_OK, msgId=C0A895800C22070DEA4E084471D503DD, offsetMsgId=C0A8958000002A9F000000000004A200, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=0], queueOffset=348]
SendResult [sendStatus=SEND_OK, msgId=C0A895800C22070DEA4E084471F403DE, offsetMsgId=C0A8958000002A9F000000000004A2B4, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=1], queueOffset=348]
... ...
接收消息,运行之后会通过多线程方式自动接收消息,之后不会自动退出:
//当前面目录为/usr/local/rocketmq-release-4.2.0/distribution/target/apache-rocketmq
shell>sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
ConsumeMessageThread_10 Receive New Messages: [MessageExt [queueId=0, storeSize=180, queueOffset=338, sysFlag=0, bornTimestamp=1614666697956, bornHost=/192.168.149.128:47168, storeTimestamp=1614666697969, storeHost=/192.168.149.128:10911, msgId=C0A8958000002A9F00000000000485E0, commitLogOffset=296416, bodyCRC=329761110, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message [topic=TopicTest, flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=351, CONSUME_START_TIME=1614666731966, UNIQ_KEY=C0A895800C22070DEA4E08445CE403B5, WAIT=true, TAGS=TagA}, body=18]]]
ConsumeMessageThread_12 Receive New Messages: [MessageExt [queueId=0, storeSize=180, queueOffset=337, sysFlag=0, bornTimestamp=1614666697812, bornHost=/192.168.149.128:47168, storeTimestamp=1614666697826, storeHost=/192.168.149.128:10911, msgId=C0A8958000002A9F0000000000048310, commitLogOffset=295696, bodyCRC=437357949, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message [topic=TopicTest, flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=351, CONSUME_START_TIME=1614666731964, UNIQ_KEY=C0A895800C22070DEA4E08445C5403B1, WAIT=true, TAGS=TagA}, body=18]]]
... ...
4.部署console
4.1、本地部署console
1、从github:https://github.com/apache/rocketmq-externals 直接下载项目源码,之后通过idea直接引用里面的rocketmq-console模块即可,
2、修改application.properties配置文件,修改为自己的namesrv地址即可:
rocketmq.config.namesrvAddr=192.168.149.128:9876
3、启动 APP 启动类,效果如下:
这里能看到上面测试发送的消息记录:
4.2、linux部署console
紧着本地部署,在你修改完配置文件后,进入console模块目录下:\rocketmq-externals-master\rocketmq-console,cmd 命令下执行:mvn clean package -Dmaven.test.skip=true (直接通过idea 操作也可以),会在target目录下生产一个 rocketmq-console-ng-2.0.0.jar项目,该项目是一个springboot项目,可以使用java -jar rocketmq-console-ng-2.0.0.jar 启动项目。
通过xftp 把jar拷贝到linux上对应的目录下,直接启动即可。
[root@localhost local]# java -jar rocketmq-console-ng-2.0.0.jar
// 后台启动
[root@localhost local]# nohup java -jar rocketmq-console-ng-2.0.0.jar &
//默认8080端口,如果端口被占了,可以指定 java -jar rocketmq-console-ng-2.0.0.jar --server.port=8081
启动成功后,直接访问你的地址,效果如下:
5.过程中的问题解决
5.1、内存分配失败
问题1: Java HotSpot™ 64-Bit Server VM warning: INFO: os::commit_memory(0x00000005c0000000, 8589934592, 0) failed; error=‘Cannot allocate memory’ (errno=12)
分析: 因为 apache-rocketmq/bin 目录下启动 nameserv 与 broker 的 runbroker.sh 和 runserver.sh 文件中默认分配的内存太大,而系统实际内存却太小导致启动失败。官方要求是必须有 4g 可用内存以上。
方案: 找到下面的 distribution/target/apache-rocketmq/bin 下的 runbroker.sh 和 runserver.sh 文件,然后进行调整。
//调整runbroker.sh,是服务器情况调整即可:
#JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn125m"
//调整runserver.sh,是服务器情况调整即可:
#JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn125m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
三、总结
首先明白mq本身是怎么一回事,及其作用及使用场景等,自己再跑个完整的例子,这个过程看着简单,但也会遇到很多问题,当你把一个个问题解决后,学的才深刻。