kafka的儲存以partition為單位,每個partition包含一組訊息檔案(segment file)和一組索引檔案(index),並且訊息檔案和索引檔案一一對應,具有相同的檔名(副檔名不同),檔名就是這個檔案中第一條訊息的索引序號
每個索引中儲存索引序號(這條訊息在這個分割槽中的第幾條訊息)和對應的訊息在訊息檔案中的絕對位置。kafka採用的是稀疏索引,為了節省儲存空間,不會為每條訊息都建立索引,而是每隔幾條訊息建立一條索引
寫入訊息:在訊息檔案尾部連續追加寫入
查詢訊息:首先根據檔名找到所在的索引檔案,再用二分法遍歷索引檔案內的索引,找到距離目標訊息最近的索引,再去訊息檔案中,找到這條索引指向的訊息位置,從這個位置開始順序遍歷訊息檔案,找到目標訊息
rocketmq的儲存以broker為單位,儲存也分為訊息檔案和索引檔案,但是在每個broker中的訊息檔案中儲存著這個broker上的所有主題的訊息。索引檔案和kafka一樣,是按照主題和佇列分別建立的,每個佇列對應一組索引檔案,這組索引檔案在rockermq中被稱為consumerqueue,rockermq中的索引是定長稠密索引,為每條訊息都簡歷索引,每個索引的長度都是的固定的20個位元組
寫入訊息:broker上所有主題、所有佇列的訊息按照自然順序追加寫入到同乙個訊息檔案中,乙個檔案寫滿寫下乙個。
查詢訊息:根據佇列的訊息序號,計算出索引的全域性位置(索引序號*20),然後讀取這條索引,再根據索引中記錄的訊息的全域性位置,找到訊息。查詢比kafka快。
訊息佇列的儲存
在先後使用scanner類中,nextint與nextline方法讀取資訊時,先使用nextint後使用nextline時就會發生問題 nextline並沒有產生阻塞效果,直接過去了。基於兩種方法的具體使用進行說明 圖一是nextline方法在使用時,會進行整行的讀取,以回車符截止,會將讀取到的所有...
訊息佇列(三)RocketMQ如何儲存訊息
rocket的訊息是有consume queue和commit log組成。consume queue consume queue是訊息的邏輯佇列,相當於字典目錄,用來指定訊息在物理檔案 commit log 上的位置,我們可以在配置中指定consumequeue和commitlog儲存的目錄。每乙...
訊息佇列 訊息佇列
輪詢排程 一次性分發所有訊息,保證訊息平均分配,不管消費者是否能正常消費 訊息應答 保證消費端能確實消費,不丟失 公平 乙個乙個分發所有訊息,在保證分發到的執行緒確認回覆後,才分發下個訊息給下個空閒的消費者,訊息持久化 保證佇列中的訊息不丟失,包括3要素 交換器 訊息佇列 訊息都必須宣告持久化 發布...