一:消息偏移量Offset
1. 什么是offset
- message queue是無限長的數組,一條消息進來下標就會漲1,下標就是offset,消息在某個MessageQueue里的位置,通過offset的值可以定位到這條消息,或者指示Consumer從這條消息開始向后處理
- message queue中的maxOffset表示消息的最大offset, maxOffset並不是最新的那條消息的offset,而是最新消息的offset+1,minOffset則是現存在的最小offset。
- fileReserveTime=48 默認消息存儲48小時后,消費會被物理地從磁盤刪除,message queue的min offset也就對應增長。所以比minOffset還要小的那些消息已經不在broker上了,就無法被消費
2.類型(父類是OffsetStore)
- 本地文件類型
DefaultMQPushConsumer的BROADCASTING模式,各個Consumer沒有互相干擾,使用LoclaFileOffsetStore,把Offset存儲在本地 - Broker代存儲類型
DefaultMQPushConsumer的CLUSTERING模式,由Broker端存儲和控制Offset的值,使用RemoteBrokerOffsetStore
3.作用
- 主要是記錄消息的偏移量,有多個消費者進行消費
- 集群模式下采用RemoteBrokerOffsetStore, broker控制offset的值
- 廣播模式下采用LocalFileOffsetStore, 消費端存儲
4.建議
- 建議采用pushConsumer,RocketMQ自動維護OffsetStore,如果用另外一種pullConsumer需要自己進行維護OffsetStore
二:消息存儲CommitLog
- ConsumeQueue
ConsumeQueue是邏輯隊列, CommitLog是真正存儲消息文件的,存儲的是指向物理存儲的地址 ; Topic下的每個message queue都有對應的ConsumeQueue文件,內容也會被持久化到磁盤
默認地址:store/consumequeue/{topicName}/{queueid}/fileName - 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。