RocketMQ-5.消息队列的核心设计

上一节学习了NameServer的设计与各角色之间的通信实现,这一节来学学RocketMQ中Broker的设计。
Broker可是RQ的核心,大部分“重量级”工作都由其完成。
具体有以下:

  • 接受Producer发送过来的消息
  • 处理Consumer的请求
  • 消息的持久化存储
  • 消息的高可用设计
  • 服务端过滤

消息存储和发送

磁盘存储,如果是基于高速磁盘的写入,可以达600MB/s,超过了网卡的一般传输速度,但是有一点,如果磁盘是随机写,其速度会降低至几百KB/s的速度,因此保证顺序写是提高MQ性能的关键。

此外,Linux系统分为用户态和内核态,MQ是应用层软件,在与磁盘进行IO时,不可避免的会有形态切换,这其中就会有数据复制、上下文切换,开销会很大。

RocketMQ使用mmap的方式,将文件进行映射,减少了数据的复制过程,从而提高了发送高效率。
官方文档的说法:

另外,RocketMQ主要通过MappedByteBuffer对文件进行读写操作。其中,利用了NIO中的FileChannel模型将磁盘上的物理文件直接映射到用户态的内存地址中(这种Mmap的方式减少了传统IO将磁盘文件数据在操作系统内核地址空间的缓冲区和用户应用程序地址空间的缓冲区之间来回进行拷贝的性能开销),将对文件的操作转化为直接对内存地址进行操作,从而极大地提高了文件的读写效率(正因为需要使用内存映射机制,故RocketMQ的文件存储都使用定长结构来存储,方便一次将整个文件映射至内存)。

此为传说中的“零拷贝”技术。这里先挖个坑,以后再来详细学习下“零拷贝技术到底是什么?

消息存储结构

借用官方文档的一张图,说明一下存储的文件结构:

image

RQ的存储有ConsumeQueue和CommitLog配合完成。
CommitLog作为存储的实际文件,ConsumeQueue则类似于索引,存储的是CommitLog地址。

ConsumeQueue存储的节点结构如下:

8byte	|4byte	| 8byte
CommitLogOffSet	|  Size	| Tag HashCode

ConsumeQueue存储路径为:${$storeRoot}\consumequeue\${topicName}\${queueId}\${fileName}

commitLog:数据数据的存储
consumeQueue:topic下commitLog的消息索引。

这样设计的好处:

  1. CommitLog被设计为追加写入,也就是顺序写,大大提高了写入效率。
  2. 从queue获取地址读取CommitLog时,虽然是随机读,但可以利用操作系统的pageCache特性,批量读取提前加载到内存中,从而提高效率。
  3. 为了保证CommitLog和ConsumeQueue的一致性,CommitLog也会存储ConsumeQueue的信息。CommitLog存储的有:ConsumeQueues,MessageKey,Tag等信息。

高可用性机制

集群可以配置多个Broker,角色按多Master-多Slave划分。

Master-Broker:可写可读
Slave-Broker:不可写可读

发送端的高可用措施:
BrokerGroup:相同Broker名称的Broker组成BrokerGroup,MessageQueue会创建到多个BrokerGroup中,BrokerGroup中的Broker可能分布于不同的机器,Broker分主从。


机器0:broker-1-m,broker-2-m,broker-3-s,
机器1:broker-1-m,broker-2-s,broker-3-m,
机器2:broker-1-s,broker-2-m,broker-3-m,

机器0宕机,broker1-2-3均不受影响,因broker主在别的机器也有部署。

Producer->nameServer->Broker1->机器0\1->ConsumeQueue

BrokerGroup1:{broker-1..}
BrokerGroup2:{broker-2..}
BrokerGroup3:{broker-3..}

同步刷盘和异步刷盘

同步刷盘保证消息存储到磁盘之后返回请求。
异步刷盘,会有刷盘线程按批次刷盘,单次请求逻辑返回,吞吐量大。

配置方式:Broker配置文件.flushDiskType参数=SYNC_FLUSH\ASYNCH_FLUSH

同步复制和异步复制

Broker组中若有Master和Slave,消息复制有同步复制和异步复制区分。

同步复制:优点:低延迟、高吞吐量。缺点:Master出现故障,Slave未同步备份,Master恢复之后,消息可能丢失。
异步复制:优点:数据较安全。缺点:增大写入延迟,降低系统吞吐量。

配置方式:Broker.brokerRole=\ASYNCH_MASTER\SYNC_MASTER\SLAVE

最佳实践:异步刷盘+同步复制,性能+数据备份安全的兼顾

小结

  1. RMQ基于”顺序写“,”随机读“的原则,借助”页缓存“,”零拷贝“实现了一个高性能的存储结构。
  2. 基于高可用的原则,设计了主从Broker的同步\异步复制方式,以及磁盘数据存储的同步\异步刷盘方式。
posted @ 2021-10-31 22:04  simplec  阅读(155)  评论(0)    收藏  举报