RocketMQ源码学习- 1. 入门

Posted milicool

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RocketMQ源码学习- 1. 入门相关的知识,希望对你有一定的参考价值。

为什么读RocketMQ

  1. 消息队列在互联网应用中使用较为广泛,学习她可以让我门更加了解使用技术的工作原理

  2. 透过学习她的源码,拓宽认知

  3. RocketMQ经历了阿里双十一

有哪些名词

  • Producer 消息生产者,负责产生消息

  • Consumer 消息消费者,负责消费消息

  • Producer Group 一类 Producer 的集合名称,这类 Producer 通常发送一类消息,且发送逻辑一致

  • Consumer Group 一类 Consumer 的集合名称,这类 Consumer 通常消费一类消息,且消费逻辑一致

  • Push Consumer Consumer 的一种,应用通常向 Consumer 对象注册一个 Listener 接口,一旦收到消息,Consumer 对象立 刻回调 Listener 接口方法。(主动向Consumer推送消息)

  • Pull Consumer Consumer 的一种,应用通常主动调用 Consumer 的拉消息方法从 Broker 拉消息,主动权由应用控制。(由Consumer拉取消息)

  • Broker 消息中转角色,负责存储消息,转发消息

  • NameServer 负责监听和管理生产者、消费者、Broker的注册中心

  • Topic 消息主题,一级消息类型,通过 Topic 对消息进行分类

  • Tag 消息标签,二级消息类型,用来进一步区分某个 Topic 下的消息分类

  • 集群消费 一个 Group ID 所标识的所有 Consumer 平均分摊消费消息。例如某个 Topic 有 9 条消息,一个 Group ID 有 3 个 Consumer 实例,那么在集群消费模式下每个实例平均分摊,只消费其中的 3 条消息。

  • 广播消费 一个 Group ID 所标识的所有 Consumer 都会各自消费某条消息一次。例如某个 Topic 有 9 条消息,一个 Group ID 有 3 个 Consumer 实例,那么在广播消费模式下每个实例都会各自消费 9 条消息。

  • 顺序消息 消费消息的顺序要同发送消息的顺序一致,在 RocketMQ 中,主要指的是局部顺序,即一类消息为满足顺 序性,必须 Producer 单线程顺序发送,且发送到同一个队列,这样 Consumer 就可以按照 Producer 发送 的顺序去消费消息。

  • 普通顺序消息 顺序消息的一种,正常情况下可以保证完全的顺序消息,但是一旦发生通信异常,Broker 重启,由于队列 总数发生变化,哈希取模后定位的队列会变化,产生短暂的消息顺序不一致。 如果业务能容忍在集群异常情况(如某个 Broker 宕机或者重启)下,消息短暂的乱序,使用普通顺序方 式比较合适。

代码模块组成, 模块架构图

项目结构如图

技术图片

 

 

版本为4.5.2

  • rocketmq-acl: 权限控制(ACL)主要为RocketMQ提供Topic资源级别的用户访问控制

  • rocketmq-broker: 负责转发消息, 接收producer发来的消息并存储,同时consumer来这里拉取消息

  • rocketmq-client: 包含了Producer和Consumer,负责消息发送和接收

  • rocketmq-common: 通用的常量枚举、基类方法或者数据结构,按描述的目标来分包通俗易懂

  • rocketmq-distribution:一些 sh 脚本和 配置,主要是在部署的时候用的

  • rocketmq-filter:过滤器,用于服务端 SQL92 的过滤方式

  • rocketmq-logappender: 集成log4、log4j2、logback日志

  • rocketmq-logging: 提供日志的工厂类和方法

  • rocketmq-namesrv: 注册中心,每个 broker 都会在这里注册,client 也会从这里获取 broker 的相关信息

  • rocketmq-openmassageing:

  • rocketmq-remoting: 用Netty4写的客户端和服务端

  • rocketmq-store:存储服务,消息存储,索引存储,commitLog存储

  • rocketmq-ools:命令行工具

RocketMQ部署结构图

技术图片

技术图片

  • Name Server 是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。

  • Broker 部署相对复杂,Broker 分为 Master 与 Slave,一个 Master 可以对应多个 Slave,但是一个 Slave 只能 对应一个 Master,Master 与 Slave 的对应关系通过指定相同的 BrokerName,不同的 BrokerId 来定义,BrokerId 为 0 表示 Master,非 0 表示 Slave。Master 也可以部署多个。每个 Broker 与 Name Server 集群中的所有节 点建立长连接,定时注册 Topic 信息到所有 Name Server。

  • Producer 与 Name Server 集群中的其中一个节点(随机选择)建立长连接,定期从 Name Server 取 Topic 路 由信息,并向提供 Topic 服务的 Master 建立长连接,且定时向 Master 发送心跳。Producer 完全无状态,可集群部署。

  • Consumer 与 Name Server 集群中的其中一个节点(随机选择)建立长连接,定期从 Name Server 取 Topic 路由信息,并向提供 Topic 服务的 Master、Slave 建立长连接,且定时向 Master、Slave 发送心跳。Consumer 既可以从 Master 订阅消息,也可以从 Slave 订阅消息,订阅规则由 Broker 配置决定。

以上是关于RocketMQ源码学习- 1. 入门的主要内容,如果未能解决你的问题,请参考以下文章

RocketMQ源码学习- 1. 入门

源码分析RocketMQ系列索引

云原生中间件RocketMQ源码包结构和集群架构模型

云原生中间件RocketMQ源码包结构和集群架构模型

Rocket MQ 问题排查命令

Windown10下Rocket MQ 安装