一種基於文件系統的消息中間件持久消息的存儲方法
2023-04-24 03:14:31 1
專利名稱:一種基於文件系統的消息中間件持久消息的存儲方法
技術領域:
本發明涉及一種基於文件系統的消息中間件持久消息的存儲方法。
背景技術:
以可靠傳輸為目的的消息中間件伺服器,存儲客戶端發送給伺服器端的消息是一 個非常關鍵的環節。對消息的存儲一般需要達到以下要求 1)可靠性,能夠將客戶端發給伺服器端的每條消息做持久化,能根據消息標識符 定位到消息的準確存儲位置。 2)性能,能夠快速將消息在非易失性存儲器和內存之間進行置換。
目前實現消息存儲最常用的兩種方式
1.內存存儲 將所有客戶端發送給伺服器端的消息保存在內存之中,由於所有消息均在內存中 操作,採用這個方式的消息中間件吞吐性能非常高。但是該種方式存在以下問題
如果伺服器宕機,所有保存在內存之中的消息都將丟失,再次重啟之後,這些消息 無法被消費; 消息在內存中存儲有容量限制,如果超出了可用的內存上限,將阻塞客戶端的發
送進程,直到這些消息被接收者取得而被伺服器釋放其所佔用的內存。 2.資料庫存儲 將所有客戶端發送給伺服器端的消息保存在資料庫之中,即使伺服器宕機,重啟 之後消息中間件依然可以從資料庫中恢復所有未被客戶端接收的消息。但是該種方式存在 以下問題 在高負載的情況下,往資料庫中頻繁插入和刪除消息記錄的資料庫操作會導致整 個消息中間件消息吞吐性能嚴重降低。 綁定額外的資料庫系統會降低伺服器的處理性能和網絡性能,還會增加用戶的投 資 綜合以上兩種方式,基於文件系統的消息中間件持久消息的存儲技術需要解決可 靠性問題,性能問題等。
發明內容
本發明的目的就是針對上述的不足,提供了一種在保證消息存儲的可靠性的同 時,還提高了持久消息的讀寫性能的基於文件系統的消息中間件持久消息的存儲方法。
—種基於文件系統的消息中間件持久消息的存儲方法,包括如下步驟
第一步以消息為參數創建AddMessageCommand。 即在AddMessageCommand的message欄位設為需要存儲的消息;在 RemoveMessageCommand中的messageld設為需要從存儲中刪除的消息標識符。Visitor則 提供了以訪問者模式處理所有Command對象的方法,Visitor的子類IndexVisitor會根據不同的Command子類建立索引。第二步把AddMessageCommand對象序列化為字節流。 Command類提供了 write和read序列化和反序列化的方法,write方法可以將 Command對象序列化成字節流,read方法可以將字節流反序列化成Command對象。通過 這樣的方式,就可以將Command對象存儲在日誌文件中,也可以從日誌文件讀取內容生成 Command對象。 第三步將字節流寫入日誌文件,如果設置為異步模式,則將多個寫入操作合併, 將每個寫入操作需寫入的字節流合併, 一次性寫入到日誌文件中。 第四步更新內存中的索引頁,將消息標識符和消息對應於日誌文件中的位置插 入到索引樹中的節點。 索引信息存放在一個B+樹的葉節點中,key對應於消息的標識符,value對應該消 息在日誌文件中的位置。每次在日誌文件中添加一條消息記錄,都會更新B+樹更新索引信 息。 每一個B+樹節點都存放在索引文件中,每個節點佔用的磁碟容量為4096個字節, 在第一頁中存放了整個索引的元數據,可以通過這個元數據找到所有隊列的消息索引。由 於內存容量的限制,並非將所有索引信息都存放在內存之中,而是通過設置索引頁緩存保 存最近使用的索引頁。 第五步寫回索引文件,將更新的索引樹節點所對應的文件頁以雙寫的方式寫回 到索引文件。 每次更新索引文件都將需要更新的文件頁全部順序寫入備份文件,當寫入備份文 件成功之後,再將這些文件頁寫回到索引文件,通過這樣的方式來避免寫回索引文件時宕 機引起的索引文件不一致的問題。當寫入備份文件不成功時,就直接丟棄這些需要更新的 索引頁,當寫回索引頁不成功時,則從備份文件恢復這些索引頁。
然後設置一讀取流程,具體來說為 第一步查找消息在日誌文件中的位置,通過消息標識符在索引樹上查找其對應 的日誌文件位置信息。 第二步反序列化,讀取日誌文件,將讀到的字節流反序列化成 AddMessageCommand對象。 第三步讀取消息,從AddMessageCommand對象中取出消息。 本發明提供的基於文件系統的消息中間件持久消息的存儲方法,具有如下優點 1.可以做持久存儲,即使宕機,也能保證在重啟之後恢復所有的消息,將消息中間
件運行狀態恢復到宕機之前的運行狀態。 2.可以根據消息標識符快速檢索到消息,提高消息中間件消息的吞吐量。
圖1為本發明實施例中項向儲子系統存儲消息的流程圖;
圖2為本發明實施例中從存儲子系統讀取消息的流程圖。
具體實施例方式
下面以非限定性的實施方式來具體解釋、說明本技術方案。 —種基於文件系統的消息中間件持久消息的存儲方法,包括一存儲步驟和一讀取 步驟。 存儲步驟如圖1所示,具體為 第 一 步以消息為參數創建AddMessageCommand,艮卩在AddMessageCommand的 message欄位設為需要存儲的消息;在RemoveMessageCommand中的messageld設為需要從 存儲中刪除的消息標識符;第二步把AddMessageCommand對象序列化為字節流; 第三步將字節流寫入日誌文件,如果設置為異步模式,則將多個寫入操作合併, 將每個寫入操作需寫入的字節流合併,一次性寫入到日誌文件中; 第四步更新內存中的索引頁,將消息標識符和消息對應於日誌文件中的位置插 入到索引樹中的節點; 第五步寫回索引文件,將更新的索引樹節點所對應的文件頁以雙寫的方式寫回 到索引文件。
而讀取步驟如圖2所示,具體來說為 第一步查找消息在日誌文件中的位置,通過消息標識符在索引樹上查找其對應 的日誌文件位置信息。 第二步反序列化,讀取日誌文件,將讀到的字節流反序列化成 AddMessageCommand對象。 第三步讀取消息,從AddMessageCommand對象中取出消息。
權利要求
一種基於文件系統的消息中間件持久消息的存儲方法,其特徵在於包括如下步驟第一步以消息為參數創建AddMessageCommand,即在AddMessageCommand的message欄位設為需要存儲的消息;在RemoveMessageCommand中的messageId設為需要從存儲中刪除的消息標識符;第二步把AddMessageCommand對象序列化為字節流;第三步將字節流寫入日誌文件,如果設置為異步模式,則將多個寫入操作合併,將每個寫入操作需寫入的字節流合併,一次性寫入到日誌文件中;第四步更新內存中的索引頁,將消息標識符和消息對應於日誌文件中的位置插入到索引樹中的節點;第五步寫回索引文件,將更新的索引樹節點所對應的文件頁以雙寫的方式寫回到索引文件。
全文摘要
本發明是一種基於文件系統的消息中間件持久消息的存儲方法,包括如下步驟第一步以消息為參數創建AddMessageCommand;第二步把AddMessageCommand對象序列化為字節流;第三步將字節流寫入日誌文件,如果設置為異步模式,則將多個寫入操作合併,將每個寫入操作需寫入的字節流合併,一次性寫入到日誌文件中;第四步更新內存中的索引頁,將消息標識符和消息對應於日誌文件中的位置插入到索引樹中的節點;第五步寫回索引文件。本發明提供了一種在保證消息存儲的可靠性的同時,還提高了持久消息的讀寫性能的基於文件系統的消息中間件持久消息的存儲方法。
文檔編號H04L29/08GK101707633SQ20091023096
公開日2010年5月12日 申請日期2009年11月27日 優先權日2009年11月27日
發明者李景澤, 謝鍾揚 申請人:山東中創軟體商用中間件股份有限公司