rocketMQ(八) rocketMQ 消息队列Offset和CommitLog

一:消息偏移量Offset

1. 什么是offset

  1. message queue是无限长的数组,一条消息进来下标就会涨1,下标就是offset,消息在某个MessageQueue里的位置,通过offset的值可以定位到这条消息,或者指示Consumer从这条消息开始向后处理
  2. message queue中的maxOffset表示消息的最大offset, maxOffset并不是最新的那条消息的offset,而是最新消息的offset+1,minOffset则是现存在的最小offset。
  3. fileReserveTime=48 默认消息存储48小时后,消费会被物理地从磁盘删除,message queue的min offset也就对应增长。所以比minOffset还要小的那些消息已经不在broker上了,就无法被消费

2.类型(父类是OffsetStore)

  1. 本地文件类型
    DefaultMQPushConsumer的BROADCASTING模式,各个Consumer没有互相干扰,使用LoclaFileOffsetStore,把Offset存储在本地
  2. Broker代存储类型
    DefaultMQPushConsumer的CLUSTERING模式,由Broker端存储和控制Offset的值,使用RemoteBrokerOffsetStore

3.作用

  1. 主要是记录消息的偏移量,有多个消费者进行消费
  2. 集群模式下采用RemoteBrokerOffsetStore, broker控制offset的值
  3. 广播模式下采用LocalFileOffsetStore, 消费端存储

4.建议

  1. 建议采用pushConsumer,RocketMQ自动维护OffsetStore,如果用另外一种pullConsumer需要自己进行维护OffsetStore

二:消息存储CommitLog

  1. ConsumeQueue
    ConsumeQueue是逻辑队列, CommitLog是真正存储消息文件的,存储的是指向物理存储的地址 ; Topic下的每个message queue都有对应的ConsumeQueue文件,内容也会被持久化到磁盘
    默认地址:store/consumequeue/{topicName}/{queueid}/fileName
  2. CommitLog
    2.1 消息文件的存储地址
    2.2 生成规则
    每个文件的默认1G =1024 * 1024 * 1024,commitlog的文件名fileName,名字长度为20位,左边补零,剩余为起始偏移量;比如00000000000000000000代表了第一个文件,起始偏移量为0,文件大小为1G=1 073 741 824Byte;当这个文件满了,第二个文件名字为00000000001073741824,起始偏移量为1073741824, 消息存储的时候会顺序写入文件,当文件满了则写入下一个文件
    2.3 判断消息存储在哪个CommitLog上
    例如 1073742827 为物理偏移量,则其对应的相对偏移量为 1003 = 1073742827 - 1073741824,并且该偏移量位于第二个 CommitLog。

猜你喜欢

转载自www.cnblogs.com/guhualin/p/12891568.html