程序员RocketMQ源码解读

RocketMQ架构概览

2020-12-01  本文已影响0人  93张先生

起因

阿里巴巴团队使用 ActiveMQ 5.x处理消息,遇到瓶颈;而此时分布式流式处理引擎 Kafka 已经兴起,Kafka 存在高延迟、没有事务支持等功能就被放弃了,而阿里巴巴团队基于消息队列的基础模型开发了 RocketMQ,可以理解为 RocketMQ 为处理消息而生。

架构组件

image.png

NameServer

NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步,他们之间是独立的、并行的,各自保留了一份全部的 Broker、Topic 等集群信息。

BrokerServer

image.png

Broker主要负责消息的存储、投递和查询以及服务高可用保证,包含四个主要的模块。

Producer

消息发布的角色,支持分布式集群方式部署,无状态信息。

Consumer

消息消费的角色,支持分布式集群方式部署。支持以push推,pull拉两种模式对消息进行消费。同时也支持集群方式和广播方式的消费,它提供实时消息订阅机制。

网络部署特点

image.png

连接关系

image.png

工作流程

消息存储整体架构

image.png image.png image.png

在上面的RocketMQ的消息存储整体架构图中可以看出,RocketMQ采用的是混合型的存储结构,即为Broker单个实例下所有的队列共用一个日志数据文件(即为CommitLog)来存储。RocketMQ的混合型存储结构(多个Topic的消息实体内容都存储于一个CommitLog中)针对Producer和Consumer分别采用了数据和索引部分相分离的存储结构,Producer发送消息至Broker端,然后Broker端使用同步或者异步的方式对消息刷盘持久化,保存至CommitLog中。只要消息被刷盘持久化至磁盘文件CommitLog中,那么Producer发送的消息就不会丢失。正因为如此,Consumer也就肯定有机会去消费这条消息。当无法拉取到消息后,可以等下一次消息拉取,同时服务端也支持长轮询模式,如果一个消息拉取请求未拉取到消息,Broker允许等待30s的时间,只要这段时间内有新消息到达,将直接返回给消费端。这里,RocketMQ的具体做法是,使用Broker端的后台服务线程—ReputMessageService不停地分发请求并异步构建ConsumeQueue(逻辑消费队列)和IndexFile(索引文件)数据。

Consumer消费是已Topic 为粒度的,但是CommitLog是所有Topic消息的汇总存储,这时候需要一个已Topic为维度的commitLog文件offset的索引,便于消费这个Topic 下的数据,因此产生了 ConsumeQueue。相当于一个Topic下,有多个MessageQueue消息队列,然后将消息队列映射为ConsumeQueue消息消费队列,供Consumer快捷消费这个Topic下的数据。

上一篇 下一篇

猜你喜欢

热点阅读