RocketMQ(一)

RocketMQ

消息存储结构

RocketMQ 消息的存储是由ConsumeQueue 和CommitLog 配合完成的,
消息真正的物理存储文件是CommitLog, ConsumeQueue 是消息的逻辑队
列,类似数据库的索引文件,存储的是指向物理存储的地址。每个Topic 下
的每个Message Queue 都有一个对应的ConsumeQueue 文件。文件地址在
$ {$storeRoot} \consumequeue$ {topicName} $ { queueld} $ {fileName } 。

流程

1、nameserver启动

nameserver保存如下信息

topic => List

brokername =>BrokerData

clusterName => Set

brokerAddr => brokerLiveInfo

2、broker master注册nameserver

3、broker slave 注册broker master

4、producer 从nameserver找到broker master,进行消息下发

5、broker master进行写操作,建立 group、topic、queue,slave进行同步操作

6、consumer 在nameserver上订阅topic,进行读操作,并返回消费状态

全局顺序

topic的读写队列数设置为1,生产者和消费者的并发设置为1。本质就是放弃了高并发、高吞吐的能力。

部分有序

采用MessageListenerOrderly,编号%队列个数

重复消费

维护消费记录或者是业务上保持幂等性。

解决各种故障对消息的影响

1、多Master 每个Master 带有slave

2、主从设置成sync_master

3、Producer 同步写

4、刷盘策略 sync_flush

如何提升消费速度

1、增加Consumer实例(集群模型下,同一个group),实例数量不可以超过Topic下Read Queue的数量,超出获取不到消息。

2、设置consumerMessageBatchMaxSize(N),在消息多的时候,每次收到的是长度为N的消息链表。

3、丢弃不重要的消息,是consumer尽快追上Producer的进度。

主从同步复制

1、同步属性信息

Broker在启动的时候,判断自己的角色是否是Slave,是的话就启动定时同步任务,获取offset信息

2、同步消息体

Broker slave会通过CommitLog同步,直接进行TCP连接,连接成功后,通过对比Master和Slave的Offeset,不断进行同步

猜你喜欢

转载自blog.csdn.net/Zaric_001/article/details/113906206