在学习RocketMQ 需要先自行搭建一个RocketMQ 服务端。本节我们先来搭建一个简单的学习环境。下个章节,我们写个简单的Spring Boot 集成RocketMQ示例项目理解和验证一下RocketMQ的特性。
如果已经安装了RocketMQ 学习环境可以略过此章节《【实践篇(二)】SpringBoot集成Apache RocketMQ详解》
推荐使用docker 方式
rocketmq-5.1.3
非常好,我们将使用Docker来安装RocketMQ,这是一个非常简单且有效的方式。下面是详细的步骤:
安装并启动Docker
如果你还没有安装Docker,你可以从Docker官方网站下载并安装。安装完成后,确保Docker已经启动。
拉取RocketMQ的Docker镜像
docker pull apache/rocketmq
3. 启动NameServer
RocketMQ的工作需要依赖于一个NameServer。输入以下命令来启动一个NameServer:
启动容器
docker run -itd --restart=always --name rmqnameserver --privileged=true -p 9876:9876 -e "MAX_POSSIBLE_HEAP=100000000" apache/rocketmq sh mqnamesrv
#查看容器进程
docker ps -a
#查看日志
docker logs -f 容器id
如果报错openJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000006c8000000, 4160749568, 0) failed; error=‘Cannot allocate memory’ (errno=12)。先去掉后面的启动命令sh mqnamesrv 。先把容器启动起来,进容器修改脚本,然后手动在容器执行 sh mqnamesrv .
启动Broker
接着,我们需要启动一个Broker。输入以下命令来启动Broker:
docker run -d --restart=always --name rmqbroker --link rmqnamesrv:namesrv -p 10909:10909 -p 10911:10911 -p 10912:10912 -v D:/app/rocketmq/data/broker/logs:/home/rocketmq/logs -v D:/app/rocketmq/data/broker/store:/home/rocketmq/store -v D:/app/rocketmq/data/broker/conf/broker.conf:/home/rocketmq/rocketmq-4.9.4/conf/broker.conf -e "NAMESRV_ADDR=namesrv:9876" -e "MAX_POSSIBLE_HEAP=200000000" apache/rocketmq:4.9.4 sh mqbroker -c /home/rocketmq/rocketmq-4.9.4/conf/broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
namesrvAddr=172.20.6.37:9876
brokerIP1=172.20.6.37
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=10911
在服务器环境 内存不足的情况下会报错。
内存不足报错
penJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000006c8000000, 4160749568, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 4160749568 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /home/rocketmq/rocketmq-4.9.2/bin/hs_err_pid61.log
解决办法
启动命令 不要带 sh mqbroker 或 先把容器启动起来进容器,修改启动脚本的参数 手动启动 mqbroker
runbroker.sh
修改这个脚本的参数 拉到最底下。
重新启动OK
在容器内执行
# 容器内执行
nohup sh mqbroker &
# 查看日志
tail -f nohup.out
http://ip:9876
来访问RocketMQ的Dashboard,从而验证RocketMQ是否已经成功安装并运行。在CentOS 7上安装RocketMQ学习环境
1. 安装JDK
如果服务器没有jdk 需要安装
RocketMQ需要Java环境,推荐使用Java 8。可以通过以下命令进行安装:
sudo yum install java-1.8.0-openjdk-devel
安装完成后,通过java -version
确认JDK安装成功。
2. 下载并解压RocketMQ
下载RocketMQ的tar包,这里以4.7.1版本为例:
wget https://archive.apache.org/dist/rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip
解压缩:
unzip rocketmq-all-4.7.1-bin-release.zip
3. 启动RocketMQ
首先启动Name Server:
cd rocketmq-all-4.7.1-bin-release/bin
nohup sh mqnamesrv &
然后,启动Broker:
nohup sh mqbroker -n localhost:9876 autoCreateTopicEnable=true &
4. 验证RocketMQ是否启动成功
通过以下命令,如果看到Broker的信息,那么恭喜你,RocketMQ已经启动成功:
sh mqadmin clusterList -n localhost:9876
RocketMQ的官方GitHub问题链接:RocketMQ Issues
2. 内存不足问题:RocketMQ需要足够的内存才能运行。如果出现内存不足的错误,你可以增加系统的内存,或者调整RocketMQ的内存配置。我的学习环境服务器配置比较低,安装过程出现了内存不足情况,解决方法修改了启动脚本中的内存设置,直接给一个比较小的值,就ok了。
3. 端口冲突问题:如果RocketMQ的端口(默认为10911和10909)已经被其他应用程序占用,RocketMQ将无法启动。你可以更改RocketMQ的端口,或者停止占用这些端口的应用程序。
4. 启动脚本问题:RocketMQ的启动脚本有一些特殊的要求,如果不正确地修改了这些脚本,可能会导致RocketMQ启动失败。
5. 兼容性问题:RocketMQ可能不兼容某些特定的操作系统或JDK版本。你需要确保你的环境满足RocketMQ的系统要求。
6. broker的IP配置问题,如果docker 安装需要将Broker的Ip配置成宿主机IP.不然在发送消息的时候报错,连接Broker失败。解决办法,进到容器里。进入conf 目录修改Broker.conf 添加brokerIP1 = 你的宿主机IP
2023-09-09 16:44:14.984 ERROR 22980 --- [nio-8080-exec-1] o.a.r.spring.core.RocketMQTemplate : syncSend failed. destination:test-topic, message:GenericMessage [payload=test a msg, headers={id=be655749-804a-f36e-40f5-c160c74e4ff0, timestamp=1694249048593}]
2023-09-09 16:44:15.000 ERROR 22980 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.messaging.MessagingException: Send [3] times, still failed, cost [6386]ms, Topic: test-topic, BrokersSent: [698f11314447, 698f11314447, 698f11314447]
See http://rocketmq.apache.org/docs/faq/ for further details.; nested exception is org.apache.rocketmq.client.exception.MQClientException: Send [3] times, still failed, cost [6386]ms, Topic: test-topic, BrokersSent: [698f11314447, 698f11314447, 698f11314447]
See http://rocketmq.apache.org/docs/faq/ for further details.] with root cause
org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <172.17.0.8:10911> failed
at org.apache.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:392) ~[rocketmq-remoting-4.5.2.jar:4.5.2]
at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessageSync(MQClientAPIImpl.java:465) ~[rocketmq-client-4.5.2.jar:4.5.2]