记录一次windows系统下安装rocketmq 以及 rocketmq_console的问题
windows RocketMQ 安装流程
- 在官网下载资源包
- 解压到某一个目录
- RocketMQ解压目录结构说明
bin: 可执行文件目录
confing:配置文件目录
lib:依赖库,一堆jar包 - 配置RocketMQ_HOME
- 启动MQ NameServer
cmd命令框执行:
这一步再windows可能会出现以下错误:start mqnamesrv.cmd
这个问题大致说明的是地址(端口)已经被使用,需要变更一下,此时需要补充一个知识点,关于RocketMq的端口信息 - 修改RunBroker配置
进入至MQ文件夹\bin目录下,修改Bean目录下的runbroker.cmd中jvm占用内存的大小
- cmd执行
start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true
启动Broker
RocketMQ 端口信息说明
在安装rocketmq之后,要开放的端口一般来说有四个:
9876,10911,10912,10909
9876:这个是nameserver中的端口,连接nameserver就靠这个端口
剩余的三个端口都是RocketMQ-Broker中的端口
listenPort:listenPort参数是broker的监听端口号,是remotingServer服务组件使用,作为对Producer和Consumer提供服务的端口号,默认为
10911,可以通过配置文件修改
打开broker-x.conf,修改或者增加listenPort参数
listenPort = 10911
10909:fastListenPort: fastListenPort参数是fastRemotingServer服务组件使用,默认为listenPort - 2 , 可以通过配置文件修改
fastListenPort = 10909
10912:haListenPort, haListenPort参数是HAService服务组件使用,用于Broker的主从同步,默认为ListenPort - 1 可以通过配置文件修改
haListenPort = 10912
RemotingServer 和 fastRemotingServer的区别
Broker端:
remotingServer可以处理客户端的所有请求,如:生产者发送消息的请求,消费者拉取消息的请求,
fastRemotingServer功能基本与remotingServer相同,唯一不同的是不可以处理消费者拉取消息的请求
Broker再向NameServer注册时,只会上报RemotingServer监听的listenPort端口
客户端:
默认情况下,生产者发送消息是请求fastRemotingServer,我们可以通过配置让其请求RemotingServer,消费者拉取消息只能请求remotingServer
解决windows/linux 系统安装rocketMq端口被占用的情况
linux 通过以下命令获取当前端口的服务:
netstat -tlnp | grep 9876
windows可以通过以下命令来看
netstat -ano |findstr “9876”
如果想要关闭当前端口下的所有进程树,可以使用如下命令
taskkill /t /f /pid 461128
RocketMQ 存储结构
RocketMQ安装好之后会再用户目录下产生一个store目录用来存储相关数据
- Commitlog: 消息是存储再commintLog目录中,以mapperdFile文件顺序寻出消息
- Config: 存放运行期间的配置文件
- Consumerqueue:该目录存放的是队列,consume queue存放着commitlog中消息的索引位置
- Index:存放着消息索引文件 indexFile, 用来实现根据key进行消息的快速查询
- Abort: 该文件再broker启动后自动创建,正常关闭abort会消失
- Checkpoint: 记录Commitlog, Consumerqueue 和 index 文件的最后刷盘时间戳
【问
】RocketMQ数据存储在磁盘会影响性能吗?
不会,RocketMQ的性能在所有的MQ中是比较高的,主要是因为RocketMQ使用了mmap零拷贝技术,consumequeue中的数据是顺序存放的,还引入了PageCache的预读取机制,使得对 consumequeuq文件的读取几乎接近于内存读取,即使在消息堆积情况下也不会影响性能
MMAP 零拷贝技术 简述
Mmap零拷贝原理是一种高效的数据传输方式,它可以再不涉及到CPU的情况下,将数据从此盘或者网络中读取到内存中,这种方式可以大大的提高数据传输的效率,减少CPU的负担,从而提高系统的性能
Mmap零拷贝的核心是内存映射文件。内存映射文件技术是直接将磁盘文件的内容直接映射到内存中,而不需要将数据从磁盘读取到内存中, 这种方式可以避免数据的复制,从而减少CPU的负担,提高传输效率
Mmap零拷贝原理的实现方式是通过系统调用来实现的,在Linux系统中,可以使用mmap()函数来实现内存映射文件,该函数可以将磁盘文件映射到内存中,并返回一个指向映射区域的指针,通过这个指针,可以直接访问磁盘文件的内容,而不需要将数据从磁盘读取到内存中
RocketMq 可视化插件
https://github.com/apache/rocketmq-externals/releases
下载后需要在配置文件 src/main/resource/application.properties 中配置NameServer 的地址和端口
然后可以再本地使用maven命令来进行打包,然后运行jar包就可以
mvn clean package -Dmaven.test.skip=true
启动插件
进入到target目录,cmd执行 java -jar rocketmq-console-ng-1.0.0.jar 访问 http://localhost:8080/
RocketMQ 的原理
RocketMQ 的 架构
RocketMQ开发官方文档
https://github.com/apache/rocketmq/blob/master/docs/cn/RocketMQ_Example.md
RocketMQ 的集群架构如下