消息中间件在高并发的业务场景占据了非常重要的位置,本篇会非常详细的详解RocketMQ @mikechen
RocketMQ简介
RocketMQ是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目。
RocketMQ特点
RocketMQ具备:纯JAVA实现、具有高性能、高可靠、高实时、分布式等特点,在生产环境有大量的应用。
RocketMQ架构
RocketMQ架构,如下图所示:
RocketMQ架构:主要由NameServer、Broker、Producer以及Consumer四部分构成。
RocketMQ原理
NameServer
1.NameServer简介
NameServer是一个功能齐全的服务器,其角色类似Dubbo中的Zookeeper,但NameServer与Zookeeper相比更轻量。
2.NameServer作用
NameServer的主要功能是为整个MQ集群提供服务协调与治理,具体就是记录维护Topic、Broker的信息,及监控Broker的运行状态。
3.NameServer功能
主要包括两个功能,如下图所示:
1)Broker管理
- NameServer接受Broker集群的注册信息,并且保存下来作为路由信息的基本数据;
- 然后提供心跳检测机制,检查Broker是否还存活;
2)路由信息管理
每个NameServer将保存关于Broker集群的整个路由信息,Producer和Conumser通过NameServer,就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。
Producer
Producer,就是消息生产者,负责产生消息,如下图所示:
生产者向消息队列中写入消息,根据不同的业务场景需要采用不同的写入策略,比如:
- 同步发送;
- 异步发送;
- 延迟发送;
- 发送事务消息等;
Producer通过MQ的负载均衡模块,选择相应的Broker集群队列进行消息投递。
Broker
Broker消息服务器,作为Server提供消息核心服务, 它接收并存储Producer生产的消息。
如下图所示:
Broker的核心功能包含:
- 接收 Producer 发过来的消息;
- 处理 Consumer 的消费消息请求;
- 消息的持 久化存储;
- 消息的 HA 机制;
- 服务端过滤功能等 ;
官网上有数据显示:具有上亿级消息堆积能力,同时可严格保证消息的有序性。
Broker配置,如下图所示:
Consumer
Consumer,即消息消费者,负责消费消息。
如下图所示:
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安装
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 虚拟机内存大小可能比较大,如果不修改会导致启动不起来。
修改为:
-server -Xms1g -Xmx1g -Xmn512m
7.启动Broker
命令:
nohup sh bin/mqbroker -c conf/broker.conf &
如果出现下图,说明已经启动成功了。
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的应用场景
1.削峰填谷
比如如秒杀等大型活动时会带来较高的流量脉冲,如果没做相应的保护,将导致系统超负荷甚至崩溃。如果因限制太过导致请求大量失败而影响用户体验,可以利用MQ 超高性能的消息处理能力来解决。
2.异步解耦
通过上、下游业务系统的松耦合设计,比如:交易系统的下游子系统(如积分等)出现不可用甚至宕机,都不会影响到核心交易系统的正常运转。
3.顺序消息
与FIFO原理类似,MQ提供的顺序消息即保证消息的先进先出,可以应用于交易系统中的订单创建、支付、退款等流程。
4.分布式事务消息
比如阿里的交易系统、支付红包等场景需要确保数据的最终一致性,需要引入 MQ 的分布式事务,既实现了系统之间的解耦,又可以保证最终的数据一致性。
将大事务拆分成小事务,减少系统间的交互,既高效又可靠。再利用MQ 的可靠传输与多副本技术确保消息不丢,At-Least-Once 特性来最终确保数据的最终一致性。
如果你还想了解更多的Kafka、RabbitMQ等主流消息中间件,请点击查看史上最强消息队列MQ万字图文总结!
mikechen睿哥
mikechen睿哥,十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》