專利名稱:一種基于文件系統(tǒng)的消息中間件持久消息的存儲(chǔ)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種基于文件系統(tǒng)的消息中間件持久消息的存儲(chǔ)方法。
背景技術(shù):
以可靠傳輸為目的的消息中間件服務(wù)器,存儲(chǔ)客戶端發(fā)送給服務(wù)器端的消息是一 個(gè)非常關(guān)鍵的環(huán)節(jié)。對(duì)消息的存儲(chǔ)一般需要達(dá)到以下要求 1)可靠性,能夠?qū)⒖蛻舳税l(fā)給服務(wù)器端的每條消息做持久化,能根據(jù)消息標(biāo)識(shí)符 定位到消息的準(zhǔn)確存儲(chǔ)位置。 2)性能,能夠快速將消息在非易失性存儲(chǔ)器和內(nèi)存之間進(jìn)行置換。
目前實(shí)現(xiàn)消息存儲(chǔ)最常用的兩種方式
1.內(nèi)存存儲(chǔ) 將所有客戶端發(fā)送給服務(wù)器端的消息保存在內(nèi)存之中,由于所有消息均在內(nèi)存中 操作,采用這個(gè)方式的消息中間件吞吐性能非常高。但是該種方式存在以下問(wèn)題
如果服務(wù)器宕機(jī),所有保存在內(nèi)存之中的消息都將丟失,再次重啟之后,這些消息 無(wú)法被消費(fèi); 消息在內(nèi)存中存儲(chǔ)有容量限制,如果超出了可用的內(nèi)存上限,將阻塞客戶端的發(fā)
送進(jìn)程,直到這些消息被接收者取得而被服務(wù)器釋放其所占用的內(nèi)存。 2.數(shù)據(jù)庫(kù)存儲(chǔ) 將所有客戶端發(fā)送給服務(wù)器端的消息保存在數(shù)據(jù)庫(kù)之中,即使服務(wù)器宕機(jī),重啟 之后消息中間件依然可以從數(shù)據(jù)庫(kù)中恢復(fù)所有未被客戶端接收的消息。但是該種方式存在 以下問(wèn)題 在高負(fù)載的情況下,往數(shù)據(jù)庫(kù)中頻繁插入和刪除消息記錄的數(shù)據(jù)庫(kù)操作會(huì)導(dǎo)致整 個(gè)消息中間件消息吞吐性能嚴(yán)重降低。 綁定額外的數(shù)據(jù)庫(kù)系統(tǒng)會(huì)降低服務(wù)器的處理性能和網(wǎng)絡(luò)性能,還會(huì)增加用戶的投 資 綜合以上兩種方式,基于文件系統(tǒng)的消息中間件持久消息的存儲(chǔ)技術(shù)需要解決可 靠性問(wèn)題,性能問(wèn)題等。
發(fā)明內(nèi)容
本發(fā)明的目的就是針對(duì)上述的不足,提供了一種在保證消息存儲(chǔ)的可靠性的同 時(shí),還提高了持久消息的讀寫性能的基于文件系統(tǒng)的消息中間件持久消息的存儲(chǔ)方法。
—種基于文件系統(tǒng)的消息中間件持久消息的存儲(chǔ)方法,包括如下步驟
第一步以消息為參數(shù)創(chuàng)建AddMessageCommand。 即在AddMessageCommand的message字段設(shè)為需要存儲(chǔ)的消息;在 RemoveMessageCommand中的messageld設(shè)為需要從存儲(chǔ)中刪除的消息標(biāo)識(shí)符。Visitor則 提供了以訪問(wèn)者模式處理所有Command對(duì)象的方法,Visitor的子類IndexVisitor會(huì)根據(jù)不同的Command子類建立索引。第二步把AddMessageCommand對(duì)象序列化為字節(jié)流。 Command類提供了 write和read序列化和反序列化的方法,write方法可以將 Command對(duì)象序列化成字節(jié)流,read方法可以將字節(jié)流反序列化成Command對(duì)象。通過(guò) 這樣的方式,就可以將Command對(duì)象存儲(chǔ)在日志文件中,也可以從日志文件讀取內(nèi)容生成 Command對(duì)象。 第三步將字節(jié)流寫入日志文件,如果設(shè)置為異步模式,則將多個(gè)寫入操作合并, 將每個(gè)寫入操作需寫入的字節(jié)流合并, 一次性寫入到日志文件中。 第四步更新內(nèi)存中的索引頁(yè),將消息標(biāo)識(shí)符和消息對(duì)應(yīng)于日志文件中的位置插 入到索引樹中的節(jié)點(diǎn)。 索引信息存放在一個(gè)B+樹的葉節(jié)點(diǎn)中,key對(duì)應(yīng)于消息的標(biāo)識(shí)符,value對(duì)應(yīng)該消 息在日志文件中的位置。每次在日志文件中添加一條消息記錄,都會(huì)更新B+樹更新索引信 息。 每一個(gè)B+樹節(jié)點(diǎn)都存放在索引文件中,每個(gè)節(jié)點(diǎn)占用的磁盤容量為4096個(gè)字節(jié), 在第一頁(yè)中存放了整個(gè)索引的元數(shù)據(jù),可以通過(guò)這個(gè)元數(shù)據(jù)找到所有隊(duì)列的消息索引。由 于內(nèi)存容量的限制,并非將所有索引信息都存放在內(nèi)存之中,而是通過(guò)設(shè)置索引頁(yè)緩存保 存最近使用的索引頁(yè)。 第五步寫回索引文件,將更新的索引樹節(jié)點(diǎn)所對(duì)應(yīng)的文件頁(yè)以雙寫的方式寫回 到索引文件。 每次更新索引文件都將需要更新的文件頁(yè)全部順序?qū)懭雮浞菸募?,?dāng)寫入備份文 件成功之后,再將這些文件頁(yè)寫回到索引文件,通過(guò)這樣的方式來(lái)避免寫回索引文件時(shí)宕 機(jī)引起的索引文件不一致的問(wèn)題。當(dāng)寫入備份文件不成功時(shí),就直接丟棄這些需要更新的 索引頁(yè),當(dāng)寫回索引頁(yè)不成功時(shí),則從備份文件恢復(fù)這些索引頁(yè)。
然后設(shè)置一讀取流程,具體來(lái)說(shuō)為 第一步查找消息在日志文件中的位置,通過(guò)消息標(biāo)識(shí)符在索引樹上查找其對(duì)應(yīng) 的日志文件位置信息。 第二步反序列化,讀取日志文件,將讀到的字節(jié)流反序列化成 AddMessageCommand對(duì)象。 第三步讀取消息,從AddMessageCommand對(duì)象中取出消息。 本發(fā)明提供的基于文件系統(tǒng)的消息中間件持久消息的存儲(chǔ)方法,具有如下優(yōu)點(diǎn) 1.可以做持久存儲(chǔ),即使宕機(jī),也能保證在重啟之后恢復(fù)所有的消息,將消息中間
件運(yùn)行狀態(tài)恢復(fù)到宕機(jī)之前的運(yùn)行狀態(tài)。 2.可以根據(jù)消息標(biāo)識(shí)符快速檢索到消息,提高消息中間件消息的吞吐量。
圖1為本發(fā)明實(shí)施例中項(xiàng)向儲(chǔ)子系統(tǒng)存儲(chǔ)消息的流程圖;
圖2為本發(fā)明實(shí)施例中從存儲(chǔ)子系統(tǒng)讀取消息的流程圖。
具體實(shí)施例方式
下面以非限定性的實(shí)施方式來(lái)具體解釋、說(shuō)明本技術(shù)方案。 —種基于文件系統(tǒng)的消息中間件持久消息的存儲(chǔ)方法,包括一存儲(chǔ)步驟和一讀取 步驟。 存儲(chǔ)步驟如圖1所示,具體為 第 一 步以消息為參數(shù)創(chuàng)建AddMessageCommand,艮卩在AddMessageCommand的 message字段設(shè)為需要存儲(chǔ)的消息;在RemoveMessageCommand中的messageld設(shè)為需要從 存儲(chǔ)中刪除的消息標(biāo)識(shí)符;第二步把AddMessageCommand對(duì)象序列化為字節(jié)流; 第三步將字節(jié)流寫入日志文件,如果設(shè)置為異步模式,則將多個(gè)寫入操作合并, 將每個(gè)寫入操作需寫入的字節(jié)流合并,一次性寫入到日志文件中; 第四步更新內(nèi)存中的索引頁(yè),將消息標(biāo)識(shí)符和消息對(duì)應(yīng)于日志文件中的位置插 入到索引樹中的節(jié)點(diǎn); 第五步寫回索引文件,將更新的索引樹節(jié)點(diǎn)所對(duì)應(yīng)的文件頁(yè)以雙寫的方式寫回 到索引文件。
而讀取步驟如圖2所示,具體來(lái)說(shuō)為 第一步查找消息在日志文件中的位置,通過(guò)消息標(biāo)識(shí)符在索引樹上查找其對(duì)應(yīng) 的日志文件位置信息。 第二步反序列化,讀取日志文件,將讀到的字節(jié)流反序列化成 AddMessageCommand對(duì)象。 第三步讀取消息,從AddMessageCommand對(duì)象中取出消息。
權(quán)利要求
一種基于文件系統(tǒng)的消息中間件持久消息的存儲(chǔ)方法,其特征在于包括如下步驟第一步以消息為參數(shù)創(chuàng)建AddMessageCommand,即在AddMessageCommand的message字段設(shè)為需要存儲(chǔ)的消息;在RemoveMessageCommand中的messageId設(shè)為需要從存儲(chǔ)中刪除的消息標(biāo)識(shí)符;第二步把AddMessageCommand對(duì)象序列化為字節(jié)流;第三步將字節(jié)流寫入日志文件,如果設(shè)置為異步模式,則將多個(gè)寫入操作合并,將每個(gè)寫入操作需寫入的字節(jié)流合并,一次性寫入到日志文件中;第四步更新內(nèi)存中的索引頁(yè),將消息標(biāo)識(shí)符和消息對(duì)應(yīng)于日志文件中的位置插入到索引樹中的節(jié)點(diǎn);第五步寫回索引文件,將更新的索引樹節(jié)點(diǎn)所對(duì)應(yīng)的文件頁(yè)以雙寫的方式寫回到索引文件。
全文摘要
本發(fā)明是一種基于文件系統(tǒng)的消息中間件持久消息的存儲(chǔ)方法,包括如下步驟第一步以消息為參數(shù)創(chuàng)建AddMessageCommand;第二步把AddMessageCommand對(duì)象序列化為字節(jié)流;第三步將字節(jié)流寫入日志文件,如果設(shè)置為異步模式,則將多個(gè)寫入操作合并,將每個(gè)寫入操作需寫入的字節(jié)流合并,一次性寫入到日志文件中;第四步更新內(nèi)存中的索引頁(yè),將消息標(biāo)識(shí)符和消息對(duì)應(yīng)于日志文件中的位置插入到索引樹中的節(jié)點(diǎn);第五步寫回索引文件。本發(fā)明提供了一種在保證消息存儲(chǔ)的可靠性的同時(shí),還提高了持久消息的讀寫性能的基于文件系統(tǒng)的消息中間件持久消息的存儲(chǔ)方法。
文檔編號(hào)H04L29/08GK101707633SQ20091023096
公開日2010年5月12日 申請(qǐng)日期2009年11月27日 優(yōu)先權(quán)日2009年11月27日
發(fā)明者李景澤, 謝鐘揚(yáng) 申請(qǐng)人:山東中創(chuàng)軟件商用中間件股份有限公司