RocketMQ中的核心机制

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

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,对消息索引进行存储。
    ConsumerQueue 格式
    CommitLog以物理文件的形式进行

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值