RocketMQ最全详解(万字图文教程)

RocketMQ最全详解(万字图文教程)-mikechen

消息中间件高并发的业务场景占据了非常重要的位置,本篇会非常详细的详解RocketMQ @mikechen

RocketMQ简介

RocketMQ是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目。

 

RocketMQ特点

RocketMQ具备:纯JAVA实现、具有高性能、高可靠、高实时、分布式等特点,在生产环境有大量的应用。

 

RocketMQ架构

RocketMQ架构,如下图所示:

RocketMQ最全详解(万字图文教程)-mikechen

RocketMQ架构:主要由NameServer、Broker、Producer以及Consumer四部分构成。

 

RocketMQ原理

RocketMQ最全详解(万字图文教程)-mikechen

NameServer

1.NameServer简介

NameServer是一个功能齐全的服务器,其角色类似Dubbo中的Zookeeper,但NameServer与Zookeeper相比更轻量。

 

2.NameServer作用

NameServer的主要功能是为整个MQ集群提供服务协调与治理,具体就是记录维护Topic、Broker的信息,及监控Broker的运行状态。

 

3.NameServer功能

主要包括两个功能,如下图所示:

RocketMQ最全详解(万字图文教程)-mikechen

1)Broker管理

  • NameServer接受Broker集群的注册信息,并且保存下来作为路由信息的基本数据;
  • 然后提供心跳检测机制,检查Broker是否还存活;

2)路由信息管理

每个NameServer将保存关于Broker集群的整个路由信息,Producer和Conumser通过NameServer,就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。

 

Producer

Producer,就是消息生产者,负责产生消息,如下图所示:

RocketMQ最全详解(万字图文教程)-mikechen

生产者向消息队列中写入消息,根据不同的业务场景需要采用不同的写入策略,比如:

  • 同步发送;
  • 异步发送;
  • 延迟发送;
  • 发送事务消息等;

Producer通过MQ的负载均衡模块,选择相应的Broker集群队列进行消息投递。

 

Broker

Broker消息服务器,作为Server提供消息核心服务, 它接收并存储Producer生产的消息。

如下图所示:

RocketMQ最全详解(万字图文教程)-mikechen

Broker的核心功能包含:

  1. 接收 Producer 发过来的消息;
  2. 处理 Consumer 的消费消息请求;
  3. 消息的持 久化存储;
  4. 消息的 HA 机制;
  5. 服务端过滤功能等 ;

官网上有数据显示:具有上亿级消息堆积能力,同时可严格保证消息的有序性。

Broker配置,如下图所示:

RocketMQ最全详解(万字图文教程)-mikechen

 

Consumer

Consumer,即消息消费者,负责消费消息。

如下图所示:

RocketMQ最全详解(万字图文教程)-mikechen

Consumer也由用户部署,一般是后台系统负责异步消费。

Consumer功能包含:

1.PUSH方式消费

顾名思义,就是推的意思,就是当MQ收到生产者产生的消息的时候,会主动将消息推送到消费者进行消费,这种模式就叫push。

2.PULL方式消费

push是MQ主动给消费者推消息,那么pull呢?刚好跟push相反,就是消费者主动去MQ中拉取消息。

完全由业务系统去控制,定时拉取消息,指定队列消费等等,当然这里需要业务系统去根据自己的业务需求去实现。

3.集群和广播消费

除此之外,还支持集群消费和广播消息消费,以及提供实时的消息订阅机制。

 

RocketMQ下载

直接从 RocketMQ 官网下载最新的安装包

下载地址:https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.9.2/rocketmq-all-4.9.2-bin-release.zip

如下图:

RocketMQ最全详解(万字图文教程)-mikechen

 

RocketMQ安装

RocketMQ安装教程(手把手教你3步成功)

1.创建rocketmq目录

用来存放rocketmq相关的东西:

mkdir /usr/rocketmq
cd /usr/rocketmq

 

2.解压安装包

由于下载的是zip压缩格式文件,因此在linux上安装unzip来进行解压:

# unzip rocketmq-all-4.9.2-bin-release.zip

 

3.修改文件名称

解压后修改文件夹名称:

mv rocketmq-4.9.2/ rocketmq

4.配置环境变量

将刚刚解压的 rocketmq 路径配置到环境变量中:

命令:

vi /etc/profile

修改环境变量:

export ROCKETMQ_HOME=/usr/rocketmq
export PATH=$PATH:$ROCKETMQ_HOME/bin:$PATH

使刚修改的配置文件生效:

source /etc/profile

 

5.启动 nameserver

命令:

nohup sh bin/mqnamesrv &

 

6.配置JVM参数

命令:

vi bin/runbroker.sh

将画圈的地方设置小点,默认配置的 jvm 虚拟机内存大小可能比较大,如果不修改会导致启动不起来。

RocketMQ最全详解(万字图文教程)-mikechen

修改为:

-server -Xms1g -Xmx1g -Xmn512m

 

7.启动Broker

命令:

nohup sh bin/mqbroker -c conf/broker.conf &

如果出现下图,说明已经启动成功了。

RocketMQ最全详解(万字图文教程)-mikechen

 

RocketMQ使用

NameServer 和 Broker 都已经启动成功,就可以进行发送和消费消息使用了。

运行源文件中以写好的测试demo。

1.生产消息

sh tools.sh org.apache.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId=AC110001104B2B193F2D6EA72CC003E7...

 

2.消费消息

sh tools.sh org.apache.rocketmq.example.quickstart.Consumer
ConsumeMessageThread_20 Receive New Messages: [MessageExt [queueId=3, storeSize=17

 

3.关闭RocketMQ

# 1.关闭NameServer
sh bin/mqshutdown namesrv
# 2.关闭Broker
sh bin/mqshutdown broker

 

RocketMQ的应用场景

RocketMQ最全详解(万字图文教程)-mikechen

1.削峰填谷

比如如秒杀等大型活动时会带来较高的流量脉冲,如果没做相应的保护,将导致系统超负荷甚至崩溃。如果因限制太过导致请求大量失败而影响用户体验,可以利用MQ 超高性能的消息处理能力来解决。

2.异步解耦

通过上、下游业务系统的松耦合设计,比如:交易系统的下游子系统(如积分等)出现不可用甚至宕机,都不会影响到核心交易系统的正常运转。

3.顺序消息

与FIFO原理类似,MQ提供的顺序消息即保证消息的先进先出,可以应用于交易系统中的订单创建、支付、退款等流程。

4.分布式事务消息

比如阿里的交易系统、支付红包等场景需要确保数据的最终一致性,需要引入 MQ 的分布式事务,既实现了系统之间的解耦,又可以保证最终的数据一致性。

将大事务拆分成小事务,减少系统间的交互,既高效又可靠。再利用MQ 的可靠传输与多副本技术确保消息不丢,At-Least-Once 特性来最终确保数据的最终一致性。

如果你还想了解更多的Kafka、RabbitMQ等主流消息中间件,请点击查看史上最强消息队列MQ万字图文总结!

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法