动力节点最新RocketMQ基本操作-01
动力节点最新RocketMQ基本操作
1. RocketMQ简介
MQ====Message Queue
编程中的
同步:排队一个一个走;一个动作做完以后,才能进行下一个
异步:各走各的;两个动作可以同时做;
官网: http://rocketmq.apache.org/
RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发,RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。
具有以下特点:
1. 能够保证严格的消息顺序
2. 提供丰富的消息拉取模式
3. 高效的订阅者水平扩展能力
4. 实时的消息订阅机制
5. 亿级消息堆积能力
2. 为什么要使用MQ
1,要做到系统解耦,当新的模块进来时,可以做到代码改动最小; 能够解耦
2,设置流程缓冲池,可以让后端系统按自身吞吐能力进行消费,不被冲垮; 能够削峰,限流
3,强弱依赖梳理能把非关键调用链路的操作异步化并提升整体系统的吞吐能力;能够异步
** **
Mq的作用 削峰限流 异步 解耦合
** **
2.1 定义
中间件(缓存中间件 redis memcache 数据库中间件 mycat canal 消息中间件mq )
面向消息的中间件(message-oriented middleware) MOM能够很好的解决以上的问题。
是指利用高效可靠的消息传递机制进行与平台无关(跨平台)的数据交流,并基于数据通信来进行分布式系统的集成。
通过提供消息传递和消息排队模型在分布式环境下提供应用解耦,弹性伸缩,冗余存储,流量削峰,异步通信,数据同步等
大致流程
发送者把消息发给消息服务器[MQ],消息服务器把消息存放在若干队列/主题中,在合适的时候,消息服务器会把消息转发给接受者。在这个过程中,发送和接受是异步的,也就是发送无需等待,发送者和接受者的生命周期也没有必然关系在发布pub/订阅sub模式下,也可以完成一对多的通信,可以让一个消息有多个接受者[微信订阅号就是这样的]
2.2 特点
2.2.1 异步处理模式
消息发送者可以发送一个消息而无需等待响应。消息发送者把消息发送到一条虚拟的通道(主题或队列)上;
消息接收者则订阅或监听该通道。一条信息可能最终转发给一个或多个消息接收者,这些接收者都无需对消息发送者做出回应。整个过程都是异步的。
案例:
也就是说,一个系统和另一个系统间进行通信的时候,假如系统A希望发送一个消息给系统B,让它去处理,但是系统A不关注系统B到底怎么处理或者有没有处理好,所以系统A把消息发送给MQ,然后就不管这条消息的“死活” 了,接着系统B从MQ里面消费出来处理即可。至于怎么处理,是否处理完毕,什么时候处理,都是系统B的事,与系统A无关。
这样的一种通信方式,就是所谓的“异步”通信方式,对于系统A来说,只要把消息发给MQ,然后系统B就会异步处去进行处理了,系统A不能“同步”的等待系统B处理完。这样的好处是什么呢?解耦
2.2.2 应用系统的解耦
发送者和接收者不必了解对方,只需要确认消息
发送者和接收者不必同时在线
2.2.3 现实中的业务
3. 各个MQ产品的比较
4. RocketMQ重要概念【重点】
Producer:消息的发送者,生产者;举例:发件人
Consumer:消息接收者,消费者;举例:收件人
Broker:暂存和传输消息的通道;举例:快递
NameServer:管理Broker;举例:各个快递公司的管理机构 相当于broker的注册中心,保留了broker的信息
Queue:队列,消息存放的位置,一个Broker中可以有多个队列
Topic:主题,消息的分类
ProducerGroup:生产者组
ConsumerGroup:消费者组,多个消费者组可以同时消费一个主题的消息
消息发送的流程是,Producer询问NameServer,NameServer分配一个broker 然后Consumer也要询问NameServer,得到一个具体的broker,然后消费消息
5. 生产和消费理解【重点】
6. RocketMQ安装
了解了mq的基本概念和角色以后,我们开始安装rocketmq,建议在linux上
6.1 下载RocketMQ
下载地址: https://rocketmq.apache.org/dowloading/releases/
注意选择版本,这里我们选择4.9.2的版本,后面使用alibaba时对应
下载地址:
https://archive.apache.org/dist/rocketmq/4.9.2/rocketmq-all-4.9.2-bin-release.zip
6.2 上传服务器
在root目录下创建文件夹
mkdir rocketmq
将下载后的压缩包上传到阿里云服务器或者虚拟机中去
6.3 解压
unzip rocketmq-all-4.9.2-bin-release.zip
如果你的服务器没有unzip命令,则下载安装一个
yum install unzip
目录分析
Benchmark:包含一些性能测试的脚本;
Bin:可执行文件目录;
Conf:配置文件目录;
Lib:第三方依赖;
LICENSE:授权信息;
NOTICE:版本公告;
6.4 配置环境变量
vim /etc/profile
在文件末尾添加
export NAMESRV_ADDR=阿里云公网IP:9876
6.5 修改nameServer的运行脚本
进入bin目录下,修改runserver.sh文件,将71行和76行的Xms和Xmx等改小一点
vim runserver.sh: 看机器配置进行优化
保存退出
6.6 修改broker的运行脚本
进入bin目录下,修改runbroker.sh文件,修改1g
保存退出
6.7 修改broker的配置文件
进入conf目录下,修改broker.conf文件
brokerClusterName = DefaultCluster brokerName = broker-a brokerId = 0 deleteWhen = 04 fileReservedTime = 48 brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH namesrvAddr=localhost:9876 autoCreateTopicEnable=true brokerIP1=阿里云公网IP
添加参数解释 namesrvAddr:nameSrv地址 可以写localhost因为nameSrv和broker在一个服务器 autoCreateTopicEnable:自动创建主题,不然需要手动创建出来 brokerIP1:broker也需要一个公网ip,如果不指定,那么是阿里云的内网地址,我们再本地无法连接使用
6.8 启动:2个文件mqnamesrv\mqbroker
首先在安装目录下创建一个logs文件夹,用于存放日志
mkdir logs
一次运行两条命令
启动nameSrv
nohup sh bin/mqnamesrv > ./logs/namesrv.log &
启动broker 这里的-c是指定使用的配置文件
nohup sh bin/mqbroker -c conf/broker.conf > ./logs/broker.log &
查看启动结果
JPS方法查看java完整:进程号、包名
6.9 RocketMQ控制台的安装RocketMQ-Console
Rocketmq 控制台可以可视化MQ的消息发送!
旧版本源码是在rocketmq-external里的rocketmq-console,新版本已经单独拆分成dashboard
网址: https://github.com/apache/rocketmq-dashboard
下载地址:
https://github.com/apache/rocketmq-dashboard/archive/refs/tags/rocketmq-dashboard-1.0.0.zip
下载后解压出来,在跟目录下执行
mvn clean package -Dmaven.test.skip=true
成功
将jar包上传到服务器上去
然后运行
nohup java -jar ./rocketmq-dashboard-1.0.0.jar rocketmq.config.namesrvAddr=127.0.0.1:9876 > ./rocketmq-4.9.3/logs/dashboard.log &
命令拓展:–server.port指定运行的端口
–rocketmq.config.namesrvAddr=127.0.0.1:9876 指定namesrv地址
访问: http://localhost:8001
运行访问端口是8001,如果从官网拉下来打包的话,默认端口是8080
端口需要放开:9876 10100-11000,不然JAVA无法调用
7. RocketMQ安装之docker
创建目录
mkdir -p /home/rocketmq mkdir -p /home/rocketmq/data/namesrv/logs /home/rocketmq/data/namesrv/store
mkdir -p /home/rocketmq/data/broker/logs /home/rocketmq/data/broker/store
7.1 下载RockerMQ需要的镜像
docker pull rocketmqinc/rocketmq:latest
docker pull styletang/rocketmq-console-ng
7.2 启动NameServer服务
7.2.1 创建NameServer数据存储路径
mkdir -p /home/rocketmq/data/namesrv/logs /home/rocketmq/data/namesrv/store
7.2.2 启动NameServer容器
docker run -d --name rmqnamesrv -p 9876:9876 -v /home/rocketmq/data/namesrv/logs:/root/logs -v /home/rocketmq/data/namesrv/store:/root/store -e “MAX_POSSIBLE_HEAP=100000000” rocketmqinc/rocketmq sh mqnamesrv
7.3 启动Broker服务
7.3.1 创建Broker数据存储路径
mkdir -p /home/rocketmq/data/broker/logs /home/rocketmq/data/broker/store
7.3.2 创建conf配置文件目录
mkdir /home/rocketmq/conf
7.3.3 在配置文件目录下创建broker.conf配置文件
# 所属集群名称,如果节点较多可以配置多个 brokerClusterName = DefaultCluster #broker名称,master和slave使用相同的名称,表明他们的主从关系 brokerName = broker-a #0表示Master,大于0表示不同的slave_ brokerId = 0 #表示几点做消息删除动作,默认是凌晨4点_ deleteWhen = 04 #在磁盘上保留消息的时长,单位是小时_ fileReservedTime = 48 #有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制; brokerRole = ASYNC_MASTER #刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要; flushDiskType = ASYNC_FLUSH #可以写localhost因为nameSrv和broker在一个服务器 namesrvAddr=192.168.0.68:9876或localhost:9876 #自动创建主题,不然需要手动创建出来 autoCreateTopicEnable=true # 设置broker节点所在服务器的ip地址,如果不指定,那么是阿里云的内网地址,我们再本地无法连接使用 brokerIP1 = 你服务器外网ip
7.3.4 启动Broker容器
需提前mkdir -p /opt/rocketmq/conf 目录
docker run -d --name rmqbroker --link rmqnamesrv:namesrv -p 10911:10911 -p 10909:10909 -v /home/rocketmq/data/broker/logs:/root/logs -v /home/rocketmq/data/broker/store:/root/store -v /home/rocketmq/conf/broker.conf:/opt/rocketmq/conf/broker.conf --privileged=true -e “NAMESRV_ADDR=namesrv:9876” -e “MAX_POSSIBLE_HEAP=200000000” rocketmqinc/rocketmq sh mqbroker -c /opt/rocketmq/conf/broker.conf
命令的详细分析: docker run: Docker的命令,用于启动一个新的容器。 -d: 以后台模式运行容器。 --name rmqbroker: 给容器命名为“rmqbroker”。 --link rmqnamesrv:namesrv: 创建一个到另一个名为“rmqnamesrv”的容器的链接,并给这个链接命名为“namesrv”。 -p 10911:10911 -p 10909:10909: 端口映射。将容器内部的10911和10909端口映射到宿主机的10911和10909端口。 -v /home/rocketmq/data/broker/logs:/root/logs -v /home/rocketmq/data/broker/store:/root/store -v /home/rocketmq/conf/broker.conf:/opt/rocketmq/conf/broker.conf: 卷映射。将宿主机上的/home/rocketmq/data/broker/logs、/home/rocketmq/data/broker/store和/home/rocketmq/conf/broker.conf目录映射到容器内部的/root/logs、/root/store和/opt/rocketmq/conf/broker.conf目录。 --privileged=true: 以特权模式运行容器,这通常用于获取更多的系统资源或执行需要更高权限的操作。 -e “NAMESRV_ADDR=namesrv:9876” -e “MAX_POSSIBLE_HEAP=200000000”: 设置环境变量。这里设置了NAMESRV_ADDR为“namesrv:9876”和MAX_POSSIBLE_HEAP为“200000000”。 rocketmqinc/rocketmq: Docker镜像名称,这里使用的是RocketMQ的Docker镜像。 sh mqbroker -c /opt/rocketmq/conf/broker.conf: 在容器内部执行的命令,启动RocketMQ broker并使用/opt/rocketmq/conf/broker.conf配置文件。 总结:这个命令是在Docker中运行一个RocketMQ broker容器的命令,它做了很多配置,包括后台运行、命名、端口映射、卷映射、特权模式运行、环境变量设置和执行命令等。
docker run -d --name rmqbroker --link rmqnamesrv:namesrv -p 10911:10911 -p 10909:10909 -v /home/rocketmq/data/broker/logs:/root/logs -v /home/rocketmq/data/broker/store:/root/store -v /home/rocketmq/conf/broker.conf:/opt/rocketmq/conf/broker.conf -e "NAMESRV_ADDR=namesrv:9876" -e "MAX_POSSIBLE_HEAP=200000000" rocketmqinc/rocketmq sh mqbroker -c /opt/rocketmq/conf/broker.conf
7.4 启动控制台
docker run -d --name rmqadmin -e "JAVA_OPTS=-Drocketmq.namesrv.addr=你的外网地址:9876 \ -Dcom.rocketmq.sendMessageWithVIPChannel=false \ -Duser.timezone=‘Asia/Shanghai’" -v /etc/localtime:/etc/localtime -p 9999:8080 styletang/rocketmq-console-ng
docker run -d --name rmqadmin -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.0.68:9876 \ -Dcom.rocketmq.sendMessageWithVIPChannel=false \ -Duser.timezone=‘Asia/Shanghai’" -v /etc/localtime:/etc/localtime -p 9100:8080 styletang/rocketmq-console-ng
7.5 正常启动后的docker ps -a
7.6 访问控制台
http://你的服务器外网ip:9999/
完整配置文件
ongPollingEnable=true offsetCheckInSlave=false # nameServer地址,分号分割 namesrvAddr=172.16.234.150:9876 fetchNamesrvAddrByAddressServer=false #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭 autoCreateSubscriptionGroup=true #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭 autoCreateTopicEnable=true sendThreadPoolQueueCapacity=100000 clusterTopicEnable=true filterServerNums=1 pullMessageThreadPoolNums=20 # broker名字,名字可重复,为了管理,每个master起一个名字,他的slave同他,eg:Amaster叫broker-a,他的slave也叫broker-a brokerName=knBroker #rocketmqHome=/usr/local/alibaba-rocketmq/ sendMessageThreadPoolNums=24 # 0 表示 Master,>0 表示 Slave brokerId=0 brokerIP1=172.16.234.150 brokerTopicEnable=true brokerPermission=6 shortPollingTimeMills=1000 clientManageThreadPoolNums=16 adminBrokerThreadPoolNums=16 flushConsumerOffsetInterval=5000 flushConsumerOffsetHistoryInterval=60000 # 在发送消息时,自动创建服务器不存在的topic,默认创建的队列数 defaultTopicQueueNums=8 rejectTransactionMessage=false notifyConsumerIdsChangedEnable=true pullThreadPoolQueueCapacity=100000 # # 所属集群名字 brokerClusterName=DefaultCluster putMsgIndexHightWater=600000 maxTransferBytesOnMessageInDisk=65536 #检测物理文件磁盘空间 diskMaxUsedSpaceRatio=75 checkCRCOnRecover=true haSlaveFallbehindMax=268435 deleteConsumeQueueFilesInterval=100 cleanResourceInterval=10000 maxMsgsNumBatch=64 flushConsumeQueueLeastPages=2 syncFlushTimeout=5000 #删除文件时间点,默认凌晨 4点 deleteWhen=04 #Broker 的角色 brokerRole=ASYNC_MASTER destroyMapedFileIntervalForcibly=120000 #commitLog每个文件的大小默认1G mapedFileSizeCommitLog=1073741824 haSendHeartbeatInterval=5000 #刷盘方式 flushDiskType=ASYNC_FLUSH cleanFileForciblyEnable=true haHousekeepingInterval=20000 redeleteHangedFileInterval=120000 #限制的消息大小 maxMessageSize=524288 flushCommitLogTimed=false haMasterAddress= maxTransferCountOnMessageInDisk=4 flushIntervalCommitLog=1000 #文件保留时间,默认 48 小时 fileReservedTime=72 flushCommitLogThoroughInterval=10000 maxHashSlotNum=5000 maxIndexNum=20000 messageIndexEnable=true #存储路径 storePathRootDir=/root/store #commitLog 存储路径 storePathCommitLog=/root/store/commitlog #消费队列存储路径存储路径 storePathConsumeQueue=/root/store/consumequeue #消息索引存储路径 storePathIndex=/root/store/index haListenPort=10912 flushDelayOffsetInterval=10000 haTransferBatchSize=32768 deleteCommitLogFilesInterval=100 maxTransferBytesOnMessageInMemory=262144 accessMessageInMemoryMaxRatio=40 flushConsumeQueueThoroughInterval=60000 flushIntervalConsumeQueue=1000 maxTransferCountOnMessageInMemory=32 messageIndexSafe=false #ConsumeQueue每个文件默认存30W条,根据业务情况调整 mapedFileSizeConsumeQueue=6000000 messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h flushCommitLogLeastPages=4 serverChannelMaxIdleTimeSeconds=120 #Broker 对外服务的监听端口 listenPort=10911 serverCallbackExecutorThreads=0 serverAsyncSemaphoreValue=64 serverSocketSndBufSize=131072 serverSelectorThreads=3 serverPooledByteBufAllocatorEnable=false serverWorkerThreads=8 serverSocketRcvBufSize=131072 serverOnewaySemaphoreValue=256 clientWorkerThreads=4 connectTimeoutMillis=3000 clientSocketRcvBufSize=131072 clientOnewaySemaphoreValue=2048 clientChannelMaxIdleTimeSeconds=120 clientPooledByteBufAllocatorEnable=false clientAsyncSemaphoreValue=2048 channelNotActiveInterval=60000 clientCallbackExecutorThreads=2 clientSocketSndBufSize=131072
docker启动mq相关容器
docker run -d -p 9876:9876 \ -v /data/rocketmq/namesrv/logs:/root/logs \ -v /data/rocketmq/namesrv/store:/root/store \ -v /data/rocketmq/conf/broker.conf:/opt/rocketmq/conf/broker.conf \ --name rmqnamesrv \ rocketmqinc/rocketmq:latest sh mqnamesrv docker run -d -p 10911:10911 -p 10909:10909 \ -v /data/rocketmq/broker/logs:/root/logs \ -v /data/rocketmq/broker/store:/root/store \ -v /data/rocketmq/conf/broker.conf:/opt/rocketmq/conf/broker.conf \ --name rmqbroker \ --add-host namesrv:192.168.0.68 \ -e "NAMESRV_ADDR=namesrv:9876" \ rocketmqinc/rocketmq:latest \ sh mqbroker -n namesrv:9876 \ -c /opt/rocketmq/conf/broker.conf autoCreateTopicEnable=true docker run -d --name rocketmq-console \ -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.0.68:9876 \ -Dcom.rocketmq.sendMessageWithVIPChannel=false" \ -p 8080:8080 -t styletang/rocketmq-console-ng