Broker是RocketMQ的核心组件,完成接受Producer生产的消息、处理Consumer的消费消息的请求、消息的持久化、以及HA等等。
-
消息的存储和发送
作为一个优秀的分布式队列,需要达到实时性、高吞吐量、高可用的要求。为了满足高可用性,通常的做法就是将消息进行持久化,入磁盘,RocketMQ也是如此。同时,磁盘的读取速度需要与网络传速速度匹配才能提高消息队列的性能,举个例子,读取本地的消息内容并通过网络发送需要经过两个步骤:1)read(file,tmp_buf,len);// tmp_buf是预先申请的内存用来读取本地内容 。 2)write(socket,tmp_buf,len);//通过Socket将tmp_buf进行发送。看似简单的两个操作实际上发生了4次数据复制(从磁盘到内核态,从内核态到用户态,从用户态到网络驱动的内核态,从网络驱动的内核态到网卡,最后进行传输),RockerMQ为提高消息发送的效率,使用堆外内存,也就是“零拷贝”,省去了从内核态到用户态的过程。
-
消息的存储结构
需要特别指出的是,ConsumerQueue中存储的不是消息本身,而是一个指向物理存储的地址,类似于DB的索引文件,这个物理存储的位置就是CommitLog。commitLog会存储ConsumerQueue、Key、Tag等信息,即使ConsumerQueue丢失也可以通过commitLog进行恢复。若存消息本身,由于多个Broker都可能会存相同的消息作为相互的备份,那么就会浪费空间。主从结点都会有一个consumequeue,根据不同的topic以及不同queueId,对消息索引进行存储。

CommitLog以物理文件的形式进行

RocketMQ采用磁盘存储实现消息持久化,利用零拷贝提高性能。消息存储结构中,ConsumerQueue保存索引,CommitLog存储实际内容。高可用通过主从复制实现,生产者连接主节点,消费者可连接任意节点。刷盘分为同步和异步两种方式,复制方式有同步和异步,分别在延迟和数据完整性间做出平衡。
最低0.47元/天 解锁文章
1989

被折叠的 条评论
为什么被折叠?



