RocketMQ存儲篇——事務消息相關的文件

在RocketMQ-3.1.9版本中,有TransactionStateService類,用於存儲每條事務消息的狀態。在該類中有兩個成員變量tranRedoLog:ConsumeQueue和tranStateTable: MapedFileQueue,其中tranRedoLog變量用於事務狀態的Redolog,當進程意外宕掉,可通過redolog恢復所有事務的狀態,tranStateTable變量用於存儲事務消息的事務狀態。

1 事務消息狀態文件

tranStateTable變量對應的物理文件的存儲路徑默認爲$HOME/store /transaction/statetable/{fileName},每個文件由2000000條數據組成,每條數據總共有24個字節,其結構如下,因此每個文件的大小爲2000000*24;
這裏寫圖片描述
每個statetable文件的名稱fileName,名字長度爲20位,左邊補零,剩餘爲起始偏移量;比如00000000000000000000代表了第一個文件,起始偏移量爲0,文件大小爲2000000*24,當第一個文件滿之後創建的第二個文件的名字爲00000000000048000000,起始偏移量爲48000000,以此類推,第三個文件名字爲00000000000096000000,起始偏移量爲96000000,消息存儲的時候會順序寫入文件,當文件滿了,寫入下一個文件。

2 事務消息REDO日誌文件

tranRedoLog變量對應的物理文件的存儲路徑默認爲$HOME/store /transaction/redolog/TRANSACTION_REDOLOG_TOPIC_XXXX/0/{fileName},每個文件由2000000條數據組成,每條數據總共有20個字節,因此每個文件的大小爲2000000*20,每條數據的結構與ConsumeQueue文件一樣,相當於topic值等於“TRANSACTION_REDOLOG_TOPIC_XXXX”,queueId等於0。
每個redolog文件的名稱fileName,名字長度爲20位,左邊補零,剩餘爲起始偏移量;比如00000000000000000000代表了第一個文件,起始偏移量爲0,文件大小爲200W*20,當第一個文件滿之後創建的第二個文件的名字爲00000000000040000000,起始偏移量爲40000000,以此類推,第三個文件名字爲00000000000080000000,起始偏移量爲80000000,消息存儲的時候會順序寫入文件,當文件滿了,寫入下一個文件。

3 定期向Producer回查事務消息的最新狀態

在Broker啓動TransactionStateService時,爲每個tranStateTable文件創建了一個定時任務,該定時任務是每隔1分鐘遍歷一遍文件中的所有消息,對於處於PREPARED狀態的事務消息,向Producer發送回查請求獲取最新的事務狀態。
爲每個tranStateTable文件創建的定時任務的大致邏輯如下:
1、檢查該Broker是否爲備用,若是則跳出本次回查,不進行回查操作;
2、若未開啓回查功能(即MessageStoreConfig. CheckTransactionMessageEnable爲false)則跳出本次回查,不進行回查操作;
3、從tranStateTable文件的開頭位置遍歷每個消息,若該消息的事務狀態不是PREPARED則繼續遍歷下一個消息,即只回查狀態爲PREPARED的事務消息;若該消息存儲的時間距離當前時間小於了間隔時間(由參數MessageStoreConfig.checkTransactionMessageAtleastInterval設置,默認是60秒)則跳出本次回查;
4、調用DefaultTransactionCheckExecuter.gotoCheck(int producerGroupHashCode, long tranStateTableOffset, long commitLogOffset, int msgSize)方法,其中tranStateTableOffset爲該消息在tranStateTable文件中的消息位置偏移量,向Producer發送CHECK_TRANSACTION_STATE請求碼,大致邏輯如下:
4.1)根據producerGroupHashCode從ProducerManager. hashcodeChannelTable變量中獲取渠道信息ClientChannelInfo對象;
4.2)以commitLogOffset從CommitLog中查詢事務消息內容,封裝成SelectMapedBufferResult對象;
4.3)構建CheckTransactionStateRequestHeader對象,其中該對象的tranStateTableOffset變量等於入參tranStateTableOffset值;
4.4)調用Broker2Client.checkProducerTransactionState(Channel channel, CheckTransactionStateRequestHeader requestHeader, SelectMapedBufferResult selectMapedBufferResult)方法向Producer發送CHECK_TRANSACTION_STATE請求碼,將事務消息內容也一發給了Producer端;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章