大厂五剑客之RocketMQ---3--RocketMQ部署---二周目

阿里开源消息队列 RocketMQ4.x介绍和新概念讲解

  • Apache RocketMQ作为阿里开源的一款高性能、高吞吐量的分布式消息中间件

  • 特点

    • 支持Broker(应用程序)和Consumer端消息过滤

    • 支持发布订阅模型,和点对点

    • 支持拉pull和推push两种消息模式,长连接轮询

    • 单一队列百万消息、亿级消息堆积

    • 支持单master节点,多master节点,多master多slave节点

    • 任意一点都是高可用,水平拓展,Producer、Consumer、队列都可以分布式

    • 消息失败重试机制、支持特定level的定时消息

    • 新版本底层采用Netty

    • 4.3.x支持分布式事务

    • 适合金融类业务,高可用性跟踪和审计功能

  • 概念

    • 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/

  • 学习资源

    • http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/
    • https://www.jianshu.com/p/453c6e7ff81c

-----------------------------------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这个代码。

大厂五剑客之RocketMQ---3--RocketMQ部署---二周目_第1张图片

推荐看这个代码。

第一步:编译代码要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
  • 存在问题,因为roccketmq-console 里面 pom.xml 版本问题

第三步: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---3--RocketMQ部署---二周目_第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也可以部署多个。

每个Broker与Name Server集群中的所有节点建立长连接。

定时(每隔30s)注册Topic信息到所有Name Server。Name Server定时(每隔10s)扫描所有存活broker的连接,如果Name Server超过2分钟没有收到心跳,则Name Server断开与Broker的连接。

消息的生产者现在nameserver根据负载均衡选择一台服务器进行消息的发送。

3) Producer

Producer与Name Server集群中的其中一个节点(随机选择)建立长连接

定期从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

Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接

定期从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------------------安装可视化控制台-----

大厂五剑客之RocketMQ---3--RocketMQ部署---二周目_第3张图片

一个topic默认是4个队列。

-----------------------------------------3-4-----------可视化控制台讲解---------------

------------3-5-----------阿里云服务器---------------

没看

------------3-6-----------阿里云安装JDK---------------

没看

------------3-7-----------阿里云安装maven---------------

没看

------------3-8--------------------------

没看

------------3-9--------------------------

大厂五剑客之RocketMQ---3--RocketMQ部署---二周目_第4张图片

------------3-10-----------RocketMq源码导入IDEA---------------

你可能感兴趣的:(MQ,XXD)