RocketMQ安装
文档
官方网站
GitHub
下载
我们的环境是基于Centos8来的,去官方网站找合适的版本进行下载,目前我这里最新的是4.9.2 release版本。
rocketmq.apache.org/dowloading/…
有两个包,一个源码包,可以下载到本地学习源码,也可以改源码然后自己打包。 为了省事,我们直接下载第二个编译好的二进制包。
环境准备
1、安装好JDK 版本是1.8
2、将下载好的二进制包上传到服务器,解压。
unzip rocketmq-all-4.9.2-bin-release.zip
修改配置
是由于默认内存分配的太大了,超出了本机内存,直接OOM了。
修改bin/目录下的如下两个脚本
runbroker.sh
runserver.sh
在这两个脚本里都搜索-server -Xms -Xmx,将其内存分配小点,自己玩的话512MB就足够了,够够的了!
启动
启动namesrv
cd rocketmq-all-4.9.2-bin-release/bin
./mqnamesrv &
启动broker
cd rocketmq-all-4.9.2-bin-release/bin
./mqbroker -n localhost:9876 &
RocketMQ控制台安装
控制台目前获取方式有如下两种:
- 第三方网站去下载现成的,比如csdn等。
- 官方源码包自己编译而成,官方没有现成的。
我们这里当然采取官方方式。
文档
github仓库
中文指南
这里我们使用通过下载源码自行编译的方式安装控制台。
编译打包:
mvn clean package -Dmaven.test.skip=true
打包完会在target下生成一个jar包。将编译打包好的jar包扔到服务器上
新增一个控制台操作的脚本:script.sh
#!/bin/bash
# 这里可替换为你自己的执行程序,其他代码无需更改
APP_NAME=rocketmq-dashboard-1.0.1-SNAPSHOT.jar
# 启动端口
SERVER_PORT=8222
# rocketmq-namesrv
NAMESRV_ADDR=127.0.0.1:9876
# 指定out文件名 会在jar同级目录生成一个out
OUT_FILES=rocketmq-dashboard-out
# JVM启动参数 自行调优
JAVA_OPTS="-Xms128m -Xmx128m -Xmn128m"
# 使用说明,用来提示输入参数
usage() {
echo "Usage: sh 执行脚本.sh [start|stop|restart|status]"
exit 1
}
# 检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
# 启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
nohup java -jar -Dserver.port=${SERVER_PORT} -Dfile.encoding=UTF-8 ${JAVA_OPTS} $APP_NAME --rocketmq.config.namesrvAddr=${NAMESRV_ADDR} > ${OUT_FILES}.log 2>&1 &
status
fi
}
# 停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
# 输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
# 重启
restart(){
stop
start
}
# 根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
这样可以方便操作控制台的启动停止了。
启动控制台:sh script.sh start
输入你的ip加端口访问控制台。
安装完测试
rocketmq给我们提供的默认测试工具在bin目录下,叫tools.sh。我们测试前需要配置这个脚本,为他指定namesrv地址才可以,否则测试发送/消费消息的时候会出现如下错误 connect to null failed:
需要修改一下配置:
vim tools.sh
# 在export JAVA_HOME上面添加如下这段代码
export NAMESRV_ADDR=localhost:9876
1、发送消息
./tools.sh org.apache.rocketmq.example.quickstart.Producer
成功的话会看到哗哗哗的日志,因为这个类会发送1000条消息到TopicTest这个Topic下。
2、消费消息
./tools.sh org.apache.rocketmq.example.quickstart.Consumer
成功的话会看到哗哗哗的日志,因为这个类会消费TopicTest下的全部消息。刚发送的1000条都会被消费掉。
3、控制台
发送成功后我们自然也能来到管控台去看消息和消费情况等等等信息
架构以及角色
角色
Broker
- 理解成RocketMQ本身
- broker主要用于producer和consumer接收和发送消息
- broker会定时向nameserver提交自己的信息
- 是消息中间件的消息存储、转发服务器
- 每个Broker节点,在启动时,都会遍历NameServer列表,与每个NameServer建立长连接,注册自己的信息,之后定时上报
Nameserver
- 理解成zookeeper的效果,只是他没用zk,而是自己写了个nameserver来替代zk
- 底层由netty实现,提供了路由管理、服务注册、服务发现的功能,是一个无状态节点
- nameserver是服务发现者,集群中各个角色(producer、broker、consumer等)都需要定时向nameserver上报自己的状态,以便互相发现彼此,超时不上报的话,nameserver会把它从列表中剔除
- nameserver可以部署多个,当多个nameserver存在的时候,其他角色同时向他们上报信息,以保证高可用,
- NameServer集群间互不通信,没有主备的概念
- nameserver内存式存储,nameserver中的broker、topic等信息默认不会持久化,所以他是无状态节点
Producer
- 消息的生产者
- 随机选择其中一个NameServer节点建立长连接,获得Topic路由信息(包括topic下的queue,这些queue分布在哪些broker上等等)
- 接下来向提供topic服务的master建立长连接(因为rocketmq只有master才能写消息),且定时向master发送心跳
Consumer
- 消息的消费者
- 通过NameServer集群获得Topic的路由信息,连接到对应的Broker上消费消息
- 由于Master和Slave都可以读取消息,因此Consumer会与Master和Slave都建立连接进行消费消息
核心流程
- Broker都注册到Nameserver上
- Producer发消息的时候会从Nameserver上获取发消息的topic信息
- Producer向提供服务的所有master建立长连接,且定时向master发送心跳
- Consumer通过NameServer集群获得Topic的路由信息
- Consumer会与所有的Master和所有的Slave都建立连接进行监听新消息
基本概念
可以参考官方的文档:github.com/apache/rock…