RocketMQ介绍
MQ的应用场景
MQ全称为Message Queue,即消息队列, 开发中消息队列通常有如下应用场景:
1、任务异步处理
将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。
传统方式:
改造后方式:
交互流程如下:
- 订单服务发消息到消息队列。
- 消息队列将消息发给仓储服务和物流服务。
- 仓储服务和物流服务接收到消息进行业务处理。
2、应用程序解耦合
MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。
举例:上图中,消息队列将订单服务和仓储服务进行解耦合,将订单服务和物流服务进行解耦合。
3、日志收集
进行统一业务日志收集,供分析系统进行数据分析,消息队列作为日志数据的中转站。
交互流程如下:
- 采集系统从log日志文件采集数据,发送至消息队列 。
- 各日志需求服务从消息队列 接收消息进行日志处理。
RocketMQ介绍
RocketMQ是阿里开源的一款非常优秀中间件产品,脱胎于阿里的另一款队列技术MetaQ,后捐赠给Apache基金会作为一款孵化技术,仅仅经历了一年多的时间就成为Apache基金会的顶级项目。并且它现在已经在阿里内部被广泛的应用,并且经受住了多次双十一的这种极致场景的压力。(2017年的双十一,RocketMQ流转的消息量达到了万亿级,峰值TPS达到5600万)。并且其内部通过Java语言开发,便于阅读与修改。
官网:http://rocketmq.apache.org/
消息队列技术选型对比
市场上还有哪些消息队列?
- ActiveMQ
- RabbitMQ
- ZeroMQ
- Kafka
- MetaMQ
- Redis
本项目选用RocketMQ的一个主要原因如下 :
- 支持事务消息
- 支持延迟消息
- 天然支持集群、负载均衡
- 支持指定次数和时间间隔的失败消息重发
详细的技术选型对比如下:
RabbitMQ
优点
- 支持AMQP协议
- 基于erlang语言开发,高并发性能较好
- 工作模式较为灵活
- 支持延迟消息
- 提供较为友好的后台管理页面
- 单机部署,1~2WTPS
缺点
- 不支持水平扩容
- 不支持事务
- 消息吞吐量三者最差
- 当产生消息堆积,性能下降明显
- 消息重发机制需要手动设置
- 不支持消息重复消费
RocketMQ
优点
- 高可用,高吞吐量,海量消息堆积,低延迟性能上,都表现出色
- api与架构设计更加贴切业务场景
- 支持顺序消息
- 支持事务消息
- 支持消息过滤
- 支持重复消费
- 支持延迟消息
- 支持消息跟踪
- 天然支持集群、负载均衡
- .支持指定次数和时间间隔的失败消息重发
- 单机部署,5~10WTPS
缺点
- 生态圈相较Kafka有所不如
- 消息吞吐量与消息堆积能力也不如Kafka
- 不支持主从自动切换
- 只支持Java
Kafka
优点
- 高可用,高吞吐量,低延迟性能上,都表现出色
- 使用人数多,技术生态圈完善
- 支持顺序消息
- 支持多种客户端
- 支持重复消费
缺点
- 依赖分区,消费者数量受限于分区数
- 单机消息过多时,性能下降明显
- 不支持事务消息
- 不支持指定次数和时间间隔的失败消息重发
RocketMQ基础
组成结构
RocketMQ组成结构图如下:
交互过程如下:
- Brokder定时发送自身状态 到NameServer。
- Producer 请求NameServer获取Broker的地址。
- Producer 将消息发送到Broker中的消息队列。
- Consumer订阅Broker中的消息队列,通过拉取消息,或由Broker将消息推送至Consumer。
- Producer Cluster 消息生产者群
- 负责发送消息,一般由业务系统负责产生消息。
- Consumer Cluster 消息费群
- 负责消费消息,一般是后台系统负责异步消费。
- 两种消费模式:
- Push Consumer,服务端向消费者端推送消息
- Pull Consumer,消费者端向服务定时拉取消息
- NameServer 名称服务器
- 集群架构中的组织协调员,相当于注册中心,收集broker的工作情况,不负责消息的处理
- Broker 消息服务器
- 是RocketMQ的核心,负责消息的接受,存储,发送等
- 需要定时发送自身状态 到NameServer,默认10秒发送一次,超时2分钟会认为该broker失效。
安装RocketMQ
环境要求
- 64位JDK 1.8+;
- Maven 3.2.x;
- 64位操作系统系统,本文档在Windows上安装。
下载
下载地址:http://archive.apache.org/dist/rocketmq/4.5.0/rocketmq-all-4.5.0-bin-release.zip
版本使用:4.5.0
下载后解压到一个没有空格和中文的目录。
启动
windows配置环境变量
变量名:ROCKETMQ_HOME
变量值:MQ解压路径
ROCKETMQ_HOME=D:\devtools\rocketmq-all-4.3.0-bin-release
1、配置
开发环境不需要太多的内存,这里调小一点.
Broker默认磁盘空间利用率达到85%就不再接收,这里在开发环境可以提高磁盘空间利用率报警阀值为98%。
cd bin/
vim runserver.cmd
set "JAVA_OPT=%JAVA_OPT% -server -Xms512m -Xmx512 -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
cd bin/
vim runbroker.cmd
set "JAVA_OPT=%JAVA_OPT% -server -Drocketmq.broker.diskSpaceWarningLevelRatio=0.98 -Xms512m -Xmx512m -Xmn256m"
2、启动NameServer
进入cmd命令窗口,执行bin/mqnamesrv.cmd
F:
cd F:\devenv\rocketmq-all-4.5.0-bin-release\bin
mqnamesrv.cmd
3、启动broker
进入cmd命令窗口,执行bin/mqbroker.cmd -n 127.0.0.1:9876
F:
cd F:\devenv\rocketmq‐all‐4.5.0‐bin‐release\bin
mqbroker.cmd -n 127.0.0.1:9876
-n:指定NameServer的地址
注意:
rocketMq4.2.0启动broker报错找不到或无法加载主类 Files\Java\jdk1.8.0_101\lib\dt.jar;C:\Program]
假如弹出提示框提示‘错误: 找不到或无法加载主类 xxxxxx’。打开runbroker.cmd,然后将‘%CLASSPATH%’加上英文双引号。保存并重新执行start语句。做如下图处理:
测试
1、发送消息
进入cmd命令窗口,执行:
set NAMESRV_ADDR=127.0.0.1:9876
cd F:\devenv\rocketmq‐all-4.5.0-bin-release\bin
tools.cmd org.apache.rocketmq.example.quickstart.Producer
2、接送消息
进入cmd命令窗口,执行:
set NAMESRV_ADDR=127.0.0.1:9876
tools.cmd org.apache.rocketmq.example.quickstart.Consumer
安装管理端
RocketMQ提供了UI管理工具,名为rocketmq-console
项目地址:https://github.com/apache/rocketmqexternals/tree/master/rocketmq-console
1)下载源代码
见资料文件夹rocketmq-console.zip
解压rocketmq-console.zip
2)修改配置
修改rocketmq-console\src\main\resources\application.properties
server.port=9877
// 服务端口号rocketmq.config.namesrvAddr=127.0.0.1:9876
// 名称服务地址rocketmq.config.dataPath=/tmp/rocketmq-console/data
// mq数据路径
3)打包
进入rocketmq-console目录下
cmd下执行:
mvn clean package -Dmaven.test.skip=true
4)启动 进入/rocketmq-console/target
java -jar rocketmq-console-ng-1.0.1.jar --server.port=9877 --rocketmq.config.namesrvAddr=127.0.0.1:9876
快速入门
三种消息发送方式
RocketMQ 支持 3 种消息发送方式:
1、同步消息(sync message )
producer向 broker 发送消息,执行 API 时同步等待, 直到broker 服务器返回发送结果 。
2、异步消息(async message)
producer向 broker 发送消息时指定消息发送成功及发送异常的回调方法,调用 API 后立即返回,producer发送消息线程不阻塞 ,消息发送成功或失败的回调任务在一个新的线程中执行 。
3、单向消息(oneway message)
producer向 broker 发送消息,执行 API 时直接返回,不等待broker 服务器的结果 。
消息结构
RocketMQ的消息包括基础属性和扩展属性两部分:
1、基础属性
1)topic : 主题相当于消息的一级分类,具有相同topic的消息将发送至该topic下的消息队列中,比方说一个电商系统可以分为商品消息、订单消息、物流消息等,就可以在broker中创建商品主题、订单主题等,所有商品的消息发送至该主题下的消息队列中。
2)消息体:即消息的内容 ,可以为字符串、对象等类型(可系列化)。消息的最大长度 是4M。
3) 消息 Flag:消息的一个标记,RocketMQ不处理,留给业务系统使用。
2、扩展属性
1)tag :相当于消息的二级分类,用于消费消息时进行过滤,可为空 。
2)keys: Message 索引键,在运维中可以根据这些 key 快速检索到消息, 可为空 。 3)waitStoreMsgOK :消息发送时是否等消息存储完成后再返回 。
Message 的基础属性主要包括消息所属主题 topic , 消息 Flag(RocketMQ 不做处理)、 扩展属性、消息体 。
生产者工程
创建生产者工程
工程结构如下:
1)创建test-rocketmq
创建一个test-rocketmq的测试工程专门用于rocketmq的功能测试。
test-rocketmq父工程的pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>shanjupay</artifactId>
<groupId>com.shanjupay</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.shanjupay</groupId>
<artifactId>test-rocketmq</artifactId>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>