阿里开源消息队列 RocketMQ4.x介绍和新概念讲解
Apache RocketMQ作为阿里开源的一款高性能、高吞吐量的分布式消息中间件
特点
支持Broker(应用程序)和Consumer端消息过滤
支持拉pull和推push两种消息模式,长连接轮询
单一队列百万消息、亿级消息堆积
支持单master节点,多master节点,多master多slave节点
任意一点都是高可用,水平拓展,Producer、Consumer、队列都可以分布式
消息失败重试机制、支持特定level的定时消息
新版本底层采用Netty
适合金融类业务,高可用性跟踪和审计功能
概念
Producer:消息生产者
Producer Group:消息生产者组,发送同类消息的一个消息生产组
Consumer:消费者
Consumer Group:消费同类消息的多个实例,消费池
Tag:标签,子主题(二级分类)对topic的进一步细化,用于区分同一个主题下的不同业务的消息
Topic:主题, 如订单类消息,queue是消息的物理管理单位,而topic是逻辑管理单位。一个topic下可以有多个queue,
默认自动创建是4个,手动创建是8个 这个和rabbitMq对比 记忆
Message:消息,每个message必须指定一个topic
Broker:MQ程序,接收生产的消息,提供给消费者消费的程序
Name Server:给生产和消费者提供路由信息,提供轻量级的服务发现、路由、元数据信息,可以多个部署,互相独立(比zookeeper更轻量)
Offset: 偏移量,可以理解为消息进度,就像数组的下标
commit log: 消息存储会写在Commit log文件里面
走读官网地址,学会如何学习新技术 http://rocketmq.apache.org/
学习资源
-----------------------------------3-1------------
RocketMQ4.x本地快速部署
安装前提条件(推荐) 64bit OS, Linux/Unix/Mac (Windows不兼容) 64bit JDK 1.8+;
快速开始 http://rocketmq.apache.org/docs/quick-start/
下载安装包:http://mirror.bit.edu.cn/apache/rocketmq/4.4.0/rocketmq-all-4.4.0-source-release.zip
为什么不在win上面部署,因为是不兼容的。
小D下载的mq的源码:
我的mq是部署在我的苹果笔记本电脑上面的,是在虚拟机上:
/usr/local/fandayong/文件夹下。
unzip rocketmq-all-4.4.0-source-release.zip
cd rocketmq-all-4.4.0/
mvn -Prelease-all -DskipTests clean install -U //下载依赖包
cd distribution/target/apache-rocketmq
最终路径 rocketmq-all-4.4.0/distribution/target/apache-rocketmq
最新版本部署存在问题:
Please set the JAVA_HOME variable in your environment, We need java(x64)
解决:本地需要配置 JAVA_HOME 使用命令 vim ~/.bash_profile
JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home"
export JAVA_HOME
CLASS_PATH="$JAVA_HOME/lib"
PATH=".$PATH:$JAVA_HOME/bin"
解压压缩包
启动nameServer
nohup sh bin/mqnamesrv &
查看日志 tail -f nohup.out (结尾:The Name Server boot success. serializeType=JSON 表示启动成功)
启动broker (-n指定nameserver地址,nameserver服务端口为9876, broker默认端口 10911)
#nohup sh bin/mqbroker -n localhost:9876 &
nohup sh bin/mqbroker -n 192.168.244.130:9876 &
内存不足:https://blog.csdn.net/u014362882/article/details/80422136
关闭nameserver broker执行的命令
sh bin/mqshutdown broker//这个先关闭因为是依赖nameServer的
sh bin/mqshutdown namesrv
使用 jps查看进程
验证是否成功
#设置名称服务地址
export NAMESRV_ADDR=192.168.244.130:9876
#投递消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId= ...
#消费消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
ConsumeMessageThread_%d Receive New Messages: [MessageExt...
这个是守护进程的意思。
生产者生产消息投递到borker
消费者消费消费
启动的步骤:
1.解压,下载依赖包
unzip rocketmq-all-4.4.0-source-release.zip
cd rocketmq-all-4.4.0/
mvn -Prelease-all -DskipTests clean install -U //下载依赖包
2.找到项目的启动路径
cd distribution/target/apache-rocketmq
最终路径 rocketmq-all-4.4.0/distribution/target/apache-rocketmq
3.启动:
nohup sh bin/mqnamesrv &
4.报错
jdk报错:
其他报错内存不足:http://www.pianshen.com/article/9429214246/
5.启动broker
nohup sh bin/mqbroker -n 192.168.244.130:9876 &
报错内存不足:https://blog.csdn.net/u014362882/article/details/80422136
6.测试消息略。
7.关闭:先关闭broker再关闭nameserver。
--------------------------------3-2-------------------------------
源码安装RocketMQ4.x可视化控制台
报错参考:https://blog.csdn.net/weixin_34362875/article/details/88883203
下载 https://github.com/apache/rocketmq-externals 需要clone这个代码。
推荐看这个代码。
第一步:编译代码要cd rocketmq-console只编译这个代码就可以。
第二步:编译打包 mvn clean package -Dmaven.test.skip=true,下载依赖包
[ERROR] Failed to execute goal on project rocketmq-console-ng: Could not resolve dependencies for project org.apache:rocketmq-console-ng:jar:1.0.0: The following artifacts could not be resolved: org.apache.rocketmq:rocketmq-tools:jar:4.4.0-SNAPSHOT, org.apache.rocketmq:rocketmq-namesrv:jar:4.4.0-SNAPSHOT, org.apache.rocketmq:rocketmq-broker:jar:4.4.0-SNAPSHOT: Could not find artifact org.apache.rocketmq:rocketmq-tools:jar:4.4.0-SNAPSHOT -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
修改pom文件:
解决 4.4.0-SNAPSHOT
改为 4.4.0
第三步:target目录 通过java -jar的方式运行, 启动后是 8080端口 启动。
nohup java -jar rocketmq-console-ng-1.0.0.jar &
访问:10.211.55.9:8080
其他常见问题:
1)无法连接获取broker信息
修改配置文件,名称路由地址为 namesrvAddr,例如我本机地址为
src/main/resources/application.properties
rocketmq.config.namesrvAddr=127.0.0.1:9876
再次编译运行即可。
2)连接不成功
在阿里云,腾讯云或者虚拟机,记得检查端口号和防火墙是否启动
阿里云控制台有安全组,需要开放对应的端口
RocketMQ的原理:https://www.jianshu.com/p/2838890f3284
broker对应关系:https://www.jianshu.com/p/e023a3b6d2c3
自己的理解:
1) Name Server
Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。
2) Broker
Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的Broker Name,不同的Broker Id来定义,
BrokerId为0表示Master,非0表示Slave。
Master也可以部署多个。
定时(每隔30s)注册Topic信息到所有Name Server。Name Server定时(每隔10s)扫描所有存活broker的连接,如果Name Server超过2分钟没有收到心跳,则Name Server断开与Broker的连接。
消息的生产者现在nameserver根据负载均衡选择一台服务器进行消息的发送。
3) Producer
定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
Producer每隔30s(由ClientConfig的pollNameServerInterval)从Name server获取所有topic队列的最新情况,这意味着如果Broker不可用,Producer最多30s能够感知,在此期间内发往Broker的所有消息都会失败。
Producer每隔30s(由ClientConfig中heartbeatBrokerInterval决定)向所有关联的broker发送心跳,Broker每隔10s中扫描所有存活的连接,如果Broker在2分钟内没有收到心跳数据,则关闭与Producer的连接。
proder只向master建立长连接。
4) Consumer
定期从Name Server取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。
Consumer每隔30s从Name server获取topic的最新队列情况,这意味着Broker不可用时,Consumer最多最需要30s才能感知。
Consumer每隔30s(由ClientConfig中heartbeatBrokerInterval决定)向所有关联的broker发送心跳,Broker每隔10s扫描所有存活的连接,若某个连接2分钟内没有发送心跳数据,则关闭连接;并向该Consumer Group的所有Consumer发出通知,Group内的Consumer重新分配队列,然后继续消费。
当Consumer得到master宕机通知后,转向slave消费,slave不能保证master的消息100%都同步过来了,因此会有少量的消息丢失。但是一旦master恢复,未同步过去的消息会被最终消费掉。
消费者对列是消费者连接之后(或者之前有连接过)才创建的。我们将原生的消费者标识由 {IP}@{消费者group}扩展为 {IP}@{消费者group}{topic}{tag},(例如xxx.xxx.xxx.xxx@mqtest_producer-group_2m2sTest_tag-zyk)。任何一个元素不同,都认为是不同的消费端,每个消费端会拥有一份自己消费对列(默认是broker对列数量*broker数量)。新挂载的消费者对列中拥有commitlog中的所有数据。
如果有需要,可以查看Rocketmq更多源码解析
-----------------------------------------------------------3-3------------------安装可视化控制台-----
一个topic默认是4个队列。
-----------------------------------------3-4-----------可视化控制台讲解---------------
------------3-5-----------阿里云服务器---------------
没看
------------3-6-----------阿里云安装JDK---------------
没看
------------3-7-----------阿里云安装maven---------------
没看
------------3-8--------------------------
没看
------------3-9--------------------------
------------3-10-----------RocketMq源码导入IDEA---------------