RocketMQ学习笔记
目录
- 前言
- 1 RocketMQ概述
- 1.2 RocketMQ概述
- 2 RocketMQ的安装与启动
- 3 RocketMQ工作原理
- 4 RocketMQ应用
- 后记
前言
跟随尚硅谷雷老师的讲解,迈入RocketMQ的学习中。
1 RocketMQ概述
1.1 MQ概述
1.1.1 MQ简介
MQ,Message Queue,是一种提供消息队列服务的中间件,也称为消息中间件,是一套提供了消息生产、存储、消费全过程API的软件系统。消息即数据。一般消息的体量不会很大。
1.1.2 MQ用途
从网上可以查看到很多的关于MQ用途的叙述,但总结起来其实就以下三点。
异步解耦
数据收集
分布式系统会产生海量级数据流,如:业务日志、监控数据、用户行为等。针对这些数据流进行实时或批量采集汇总,然后对这些数据流进行大数据分析,这是当前互联网平台的必备技术。通过MQ完成此类数据收集是最好的选择。
1.1.3 常见MQ产品
1.1.4 MQ常见协议
一般情况下MQ的实现是要遵循一些常规性协议的。常见的协议如下:
JMS
JMS,Java Messaging Service(Java消息服务)。是Java平台上有关MOM(Message OrientedMiddleware,面向消息的中间件 PO/OO/AO)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口,简化企业应用的开发。ActiveMQ是该协议的典型实现。
STOMP
STOMP,Streaming Text Orientated Message Protocol(面向流文本的消息协议),是一种MOM设计的简单文本协议。STOMP提供一个可互操作的连接格式,允许客户端与任意STOMP消息代理(Broker)进行交互。ActiveMQ是该协议的典型实现,RabbitMQ通过插件可以支持该协议。
AMQP
AMQP,Advanced Message Queuing Protocol(高级消息队列协议),一个提供统一消息服务的应用层标准,是应用层协议的一个开放标准,是一种MOM设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。 RabbitMQ是该协议的典型实现。
MQTT
MQTT,Message Queuing Telemetry Transport(消息队列遥测传输),是IBM开发的一个即时通讯协议,是一种二进制协议,主要用于服务器和低功耗IoT(物联网)设备间的通信。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器的通信协议。 RabbitMQ通过插件可以支持该协议。
1.2 RocketMQ概述
1.2.1 简介
1.2.2 RocketMQ发展历程
2 RocketMQ的安装与启动
2.1 基本概念
2.1.1 消息(Message)
消息是指,消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。
2.1.2 主题(Topic)
Topic表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位。 topic:message 1:n message:topic 1:1。
一个生产者可以同时发送多种Topic的消息;而一个消费者只对某种特定的Topic感兴趣,即只可以订阅和消费一种Topic的消息。 producer:topic 1:n consumer:topic 1:1。
2.1.3 标签(Tag)
为消息设置的标签,用于同一主题下区分不同类型的消息。来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。标签能够有效地保持代码的清晰度和连贯性,并优化RocketMQ提供的查询系统。消费者可以根据Tag实现对不同子主题的不同消费逻辑,实现更好的扩展性。
Topic是消息的一级分类,Tag是消息的二级分类。
2.1.4 队列(Queue)
存储消息的物理实体。一个Topic中可以包含多个Queue,每个Queue中存放的就是该Topic的消息。一个Topic的Queue也被称为一个Topic中消息的分区(Partition)。
一个Topic的Queue中的消息只能被一个消费者组中的一个消费者消费。一个Queue中的消息不允许同一个消费者组中的多个消费者同时费。
在学习参考其它相关资料时,还会看到一个概念:分片(Sharding)。分片不同于分区。在RocketMQ中,分片指的是存放相应Topic的Broker。每个分片中会创建出相应数量的分区,即Queue,每个Queue的大小都是相同的。
2.1.5 消息标识(MessageId/Key)
2.2 系统架构
2.2.1 Producer
2.2.2 Consumer
2.2.3 Name Server
2.2.4 Broker
2.2.5 工作流程
2.3 单机安装与启动
2.3.1 准备工作
2.3.2 修改初始内存
修改runserver.sh
使用vim命令打开bin/runserver.sh文件。现将这些值修改为如下:
2.3.3 启动
启动broker
2.3.4 发送/接收消息测试
发送消息
接收消息
2.3.5 关闭server
无论是关闭name server还是broker,都是使用bin/mqshutdown命令。
2.4 控制台的安装与启动
RocketMQ有一个可视化的dashboard,通过该控制台可以直观的查看到很多数据。
2.4.1 下载
console项目取消了,从这里下载最新的。https://github.com/apache/rocketmq-dashboard
2.4.2 修改配置
注意上面的namesrvAddr地址如果没有配置映射的话,需要写ip地址。
2.4.3 添加依赖
2.4.4 打包
2.4.5 启动
2.4.6 访问
2.5 集群搭建理论
2.5.1 数据复制与刷盘策略
2.5.2 Broker集群模式
2.6 磁盘阵列RAID
2.6.1 RAID历史
2.6.2 RAID等级
2.6.3 关键技术
2.6.4 RAID分类
2.6.5 常见RAID等级详解
2.7 集群搭建实践
修改broker-b-s.properties
将该配置文件内容修改为如下:
其他配置
除了以上配置外,这些配置文件中还可以设置其它属性。
修改broker-a-s.properties
将该配置文件内容修改为如下:
6 启动服务器
启动NameServer集群
分别启动rocketmqOS1与rocketmqOS2两个主机中的NameServer。启动命令完全相同。
nohup sh bin/mqnamesrv &
tail -f ~/logs/rocketmqlogs/namesrv.log
启动两个Master
分别启动rocketmqOS1与rocketmqOS2两个主机中的broker master。注意,它们指定所要加载的配置文件是不同的。
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a.properties &
tail -f ~/logs/rocketmqlogs/broker.log
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b.properties &
tail -f ~/logs/rocketmqlogs/broker.log
启动两个Slave
分别启动rocketmqOS1与rocketmqOS2两个主机中的broker slave。注意,它们指定所要加载的配置文件是不同的。
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties &
tail -f ~/logs/rocketmqlogs/broker.log
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties &
tail -f ~/logs/rocketmqlogs/broker.log
2.8 mqadmin命令
在mq解压目录的bin目录下有一个mqadmin命令,该命令是一个运维指令,用于对mq的主题,集群,broker 等信息进行管理。
2.8.1 修改bin/tools.sh
在运行mqadmin命令之前,先要修改mq解压目录下bin/tools.sh配置的JDK的ext目录位置。本机的ext
目录在/usr/java/jdk1.8.0_161/jre/lib/ext
。
使用vim命令打开tools.sh文件,并在JAVA_OPT配置的-Djava.ext.dirs这一行的后面添加ext的路径。
2.8.2 运行mqadmin
直接运行该命令,可以看到其可以添加的commands。通过这些commands可以完成很多的功能。
2.8.3 该命令的官网详解
该命令在官网中有详细的用法解释。
https://github.com/apache/rocketmq/blob/master/docs/cn/operation.md
3 RocketMQ工作原理
3.1 消息的生产
3.1.1 消息的生产过程
3.3.2 Queue选择算法
3.2 消息的存储
3.2.1 commitlog文件
3.2.2 consumequeue
3.3.3 对文件的读写
3.3.4 与Kafka的对比
3.3 indexFile
3.3.1 索引条目结构
3.3.2 indexFile的创建
3.3.3 查询流程
3.4 消息的消费
3.4.1 获取消费类型
3.4.2 消费模式
3.4.3 Rebalance机制
3.4.4 Queue分配算法
3.4.5 至少一次原则
3.5 订阅关系的一致性
3.5.1 正确订阅关系
3.5.2 错误订阅关系
3.6 offset管理
3.6.1 offset本地管理模式
3.6.2 offset远程管理模式
3.6.3 offset用途
3.6.4 重试队列
3.6.5 offset的同步提交与异步提交
3.7 消费幂等
3.7.1 什么是消费幂等
3.7.2 消息重复的场景分析
3.7.3 通用解决方案
3.7.4 消费幂等的实现
3.8 消息堆积与消费延迟
3.8.1 概念
3.8.2 产生原因分析
3.8.3 消费耗时
3.8.4 消费并发度
3.8.5 单机线程数计算
3.8.6 如何避免
3.9 消息的清理
4 RocketMQ应用
4.1 普通消息
4.1.1 消息发送分类
4.1.2 代码举例
定义同步消息发送生产者
定义单向消息发送生产者
定义消息消费者
4.2 顺序消息
4.2.1 什么是顺序消息
4.2.2 为什么需要顺序消息
4.2.3 有序性分类
4.2.4 代码举例
4.3 延时消息
4.3.1 什么是延时消息
4.3.2 延时等级
4.3.3 延时消息实现原理
4.3.4 代码举例
DelayProducer
OtherConsumer
4.4 事务消息
4.4.1 问题引入
4.4.2 解决思路
4.4.3 基础知识
4.4.4 XA模式三剑客
4.4.5 XA模式架构
4.4.6 注意
4.4.7 代码举例
定义工行事务监听器
定义事务消息生产者
定义事务消息消费者
4.5 批量消息
4.5.1 批量发送消息
4.5.2 批量消费消息
4.5.3 代码举例
该批量发送的需求是,不修改最大发送4M的默认值,但要防止发送的批量消息超出4M的限制。
定义消息列表分割器
定义批量消息生产者
定义批量消息消费者
4.6 消息过滤
4.6.1 Tag过滤
4.6.2 SQL过滤
4.6.3 代码举例
定义Tag过滤生产者
定义Tag过滤消费者
定义SQL过滤生产者
定义SQL过滤消费者
4.7 消息发送重试机制
4.7.1 说明
4.7.2 同步发送失败策略
4.7.3 异步发送失败策略
4.7.4 消息刷盘失败策略
4.8 消息消费重试机制
4.8.1 顺序消息的消费重试
4.8.2 无序消息的消费重试
4.8.3 消费重试次数间隔
4.8.4 重试队列
4.8.5 消费重试配置方式
4.8.6 消费不重试配置方式
4.9 死信队列
4.9.1 什么是死信队列
4.9.2 死信队列的特征
4.9.3 死信消息的处理
后记
这个课程真的是一言难尽,期待后续进行重新更新吧。
__EOF__

本文链接:https://www.cnblogs.com/hxld/p/16829429.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?