專利名稱:一種基于NoSQL的消息中間件的實現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機(jī)技術(shù)領(lǐng)域,尤其涉及一種基于NoSQL的消息中間件的實現(xiàn)方法。
背景技術(shù):
消息中間件服務(wù)器,作為一個高效傳輸和可靠的中轉(zhuǎn)站,消息的傳輸和存儲是一個關(guān)鍵的環(huán)節(jié)。消息服務(wù)器主要有以下兩種要求:I)可靠的存儲適合于消息需要可靠傳輸?shù)膽?yīng)用環(huán)境。一般利用文件或數(shù)據(jù)庫作為消息的存儲方式,內(nèi)存開銷小,即使服務(wù)器宕機(jī),重啟后仍可從持久存儲中恢復(fù)上一次已存儲的消息。但以文件或數(shù)據(jù)庫作為存儲介質(zhì),在高負(fù)載的情況下,頻繁I/o操作會降低消息中間件的吞吐量。2)高效的傳輸適合對性能要求非??量?,但是消息無需可靠持久的應(yīng)用環(huán)境?;趦?nèi)存來進(jìn)行消息的高效緩存與轉(zhuǎn)發(fā),但在服務(wù)器宕機(jī)后不能保存消息。此外,消息中間件對于數(shù)據(jù)集成和系統(tǒng)整合是非常重要的,以中間件為接口的各子系統(tǒng)通信,可避免子系統(tǒng)間的各種差異所帶來的復(fù)雜性,如硬件平臺、網(wǎng)絡(luò)協(xié)議、開發(fā)語言所引起的。消息的時效、消息的持久、消息傳輸?shù)母咝愿档藐P(guān)注。針對以上不足提出了一種基于內(nèi)存存儲的NoSQL結(jié)合日志文件,既可解決消息服務(wù)的性能問題,也提供消息的可靠存儲。
發(fā)明內(nèi)容
本發(fā)明的目的是為了克服現(xiàn)有技術(shù)的缺陷,提供一種基于NoSQL的消息中間件的實現(xiàn)方法,在NoSQL中,數(shù)據(jù)的訪問控制都在內(nèi)存中進(jìn)行,讀寫速度很高。把消息存儲在NoSQL中,可保證消息緩存的高效,在對消息進(jìn)行查找時能利用內(nèi)存讀寫速度的優(yōu)勢,更快地定位消息。配合日志文件,更能保證在消息中間件服務(wù)器宕機(jī)后消息不丟失,并在重啟后能恢復(fù)宕機(jī)前的消息。一種基于NoSQL的消息中間件的實現(xiàn)方法,包括緩存轉(zhuǎn)發(fā)和宕機(jī)恢復(fù):I緩存轉(zhuǎn)發(fā):第一步:獲取消息的參數(shù),參數(shù)中包括了消息的內(nèi)容和路由機(jī)制及服務(wù)質(zhì)量等。主要有消息的內(nèi)容,發(fā)送者和接收者的地址或主題,開始傳輸時間,有效期,優(yōu)先級,由以上內(nèi)容決定了在消息中間件的存儲內(nèi)容及發(fā)送時機(jī)。第二步:對參數(shù)進(jìn)行封裝和序列化,序列化后的內(nèi)容可以很方便地存儲在日志文件和NoSQL中,也能從日志文件和NoSQL中通過反序列化得出原來的各種參數(shù)。第三步:消息發(fā)送與存儲,由四個線程(池)處理。
線程池A:監(jiān)聽指定的端口,接收消息。符合條件的消息立即發(fā)送,不符合發(fā)送條件的消息經(jīng)過篩選后發(fā)給線程B做持久化處理。線程B:把消息和標(biāo)志域?qū)懭肴罩疚募瑯?biāo)志域有新增、修改、刪除。線程C:把消息寫入NoSQL。線程D:對延遲發(fā)送或者發(fā)送失敗但未超出最遲交付時間的消息進(jìn)行重新發(fā)送。2宕機(jī)恢復(fù):如果服務(wù)程序宕機(jī),重啟后可從日志文件中恢復(fù)重啟前的消息。主要處理工作為:I)從日志文件讀取內(nèi)容,對標(biāo)志域進(jìn)行判斷,恢復(fù)重啟前的消息。2)把恢復(fù)后的消息寫入文件,覆蓋原來的日志文件。3)把恢復(fù)后的消息存入NoSQL。本發(fā)明提供的基于NoSQL的消息中間件帶來的有益效果:I)利用NoSQL做為緩存,可快速檢索消息,提高消息中間件的吞吐量。2)利用日志文件作為持久存儲,即使在宕機(jī)時,也能保證在重啟之后恢復(fù)所有的消息,將消息恢復(fù)成合理的狀態(tài)。
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其它的附圖。圖1為本發(fā)明實施例中系統(tǒng)存儲發(fā)送消息的流程圖;圖2為本發(fā)明實施中宕機(jī)恢復(fù)的流程圖。
具體實施例方式下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例。基于本發(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護(hù)的范圍。一種基于NoSQL的消息中間件的實現(xiàn)方法,包括緩存轉(zhuǎn)發(fā)和宕機(jī)恢復(fù)。緩存轉(zhuǎn)發(fā)如圖1所示,具體為:第一步:獲取消息的參數(shù)。消息由兩部分組成,包括消息頭和消息體。I)消息頭內(nèi)容有:a)消息的發(fā)送者和接收者的地址或者消息的主題,可有多個地址對或主題,每個地址對或主題對應(yīng)有相應(yīng)的一組質(zhì)量要求。b)消息的服務(wù)質(zhì)量要求。包括開始傳輸時間、有效期、優(yōu)先級,每組質(zhì)量要求對應(yīng)一個地址隊或主題。2)消息體包含需傳輸和存儲的消息內(nèi)容。一個消息體可以有多個不同的消息頭。
第二步:對參數(shù)進(jìn)行封裝和序列化??捎肑SON、XML> protobuf進(jìn)行序列化和反序列化。為方便后面的發(fā)送,在這里根據(jù)開始傳輸時間和有效期計算出最遲交付時間,用最遲交付時間替換有效期。并從服務(wù)器獲取唯一的序列號做為鍵,把其余內(nèi)容做為序列化后值,將此鍵值對發(fā)給第三步的線程池A。第三步:消息發(fā)送與存儲,由四個線程(池)處理。線程池A:循環(huán)處理,步驟如下:I)監(jiān)聽指定的端口,接收消息。2)把接收到的消息按優(yōu)先級從高到低排隊,按以下次序處理:a)如果當(dāng)前時間處于開始傳輸時間和最遲交付時間,則依據(jù)消息的路由規(guī)則發(fā)送給接收端。b)清除過期消息。如果當(dāng)前時間已超出最遲交付時間或發(fā)送成功后,則刪除此交付時間對應(yīng)的地址對或主題;若地址對或主題全部刪除,則刪除此消息。c)如果未到開始傳輸時間,則不發(fā)送。3)把未發(fā)送的消息加上新增標(biāo)志發(fā)送給線程B。4)轉(zhuǎn)到 I)。線程B:把消息和標(biāo)志域?qū)懭肴罩疚募?。循環(huán)處理,步驟如下:I)接收消息。2)持久化消息。解析出消息中的標(biāo)志域,將標(biāo)志和消息內(nèi)容以增加的方式寫入存儲文件。如果標(biāo)志域是新增則把此消息發(fā)送給線程C。3)轉(zhuǎn)到 I)。線程C:把消息寫入NoSQL。循環(huán)處理,步驟如下:I)接收消息。2)把消息寫入NoSQL。3)轉(zhuǎn)到 I)。線程D:對延遲發(fā)送或者發(fā)送失敗但未超出最遲交付時間的消息進(jìn)行重新發(fā)送,循環(huán)處理,步驟如下:I)從NoSQL取消息,如果當(dāng)前時間小于開始傳輸時間,則不取。2)如果當(dāng)前時間處于開始傳輸時間和最遲交付時間,則發(fā)送。3)清除過期消息。如果當(dāng)前時間已超出最遲交付時間或發(fā)送成功后,則刪除此交付時間對應(yīng)的地址對或主題,若地址對或主題未全部刪除更新此消息在NoSQL中的內(nèi)容;若地址對或主題全部刪除,則從NoSQL刪除此消息。如果消息是整條刪除,則發(fā)送刪除標(biāo)志域和消息的序列號給線程B ;如果是部分刪除地址對或主題,則發(fā)送修改標(biāo)志域和消息的序列號和未刪除的地址對或主題給線程B。4)轉(zhuǎn)到 I)。宕機(jī)恢復(fù)如圖2所示,具體為:如果服務(wù)程序宕機(jī),重啟后可從日志文件中恢復(fù)重啟前的消息。步驟如下:I)線程池A、線程B、線程D暫不啟動。2)從日志文件的最后開始讀,每讀一行,需對標(biāo)志域進(jìn)行判斷。如果標(biāo)志域是刪除,有關(guān)此條消息的所有內(nèi)容都可以忽略;如果標(biāo)志域是新增,那么這條消息必須恢復(fù);如果標(biāo)志域是刪除,那么當(dāng)前在文件中的這條消息的消息頭需緩存,讀取到此消息的消息體后再與消息頭組合。3)讀到文件頭后,把所恢復(fù)的消息以新增標(biāo)志域?qū)懭肱R時文件。寫入完成后,用此臨時文件替換原線程B的日志文件。4)啟動線程C,把所有恢復(fù)后的消息發(fā)送給線程C。5)按次序啟動線程B、線程D、線程池A。6)此恢復(fù)線程退出。以上對本發(fā)明實施例所提供的一種基于NoSQL的消息中間件的實現(xiàn)方法進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個例對本發(fā)明的原理及實施方式進(jìn)行了闡述,以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實施方式
及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本發(fā)明的限制。
權(quán)利要求
1.一種基于NoSQL的消息中間件的實現(xiàn)方法,其特征在于,包括緩存轉(zhuǎn)發(fā)和宕機(jī)恢復(fù),其中,緩存轉(zhuǎn)發(fā)包括獲取消息的參數(shù),對參數(shù)進(jìn)行封裝和序列化,消息發(fā)送與存儲;宕機(jī)恢復(fù)包括從日志文件讀取內(nèi)容,對標(biāo)志域進(jìn)行判斷,恢復(fù)重啟前的消息,把恢復(fù)后的消息寫入文件,覆蓋原來的日志文件,把恢復(fù)后的消息存入NoSQL。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,消息的參數(shù)包括消息的內(nèi)容、路由機(jī)制及服務(wù)質(zhì)量,具體包括消息的發(fā)送者和接收者的地址或者消息的主題,服務(wù)質(zhì)量包括開始傳輸時間、有效期、優(yōu)先級。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,消息的發(fā)送者和接收者或者消息的主題有多個地址對或主題,每個地址對或主題對應(yīng)相應(yīng)的一組質(zhì)量要求。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,序列化后的內(nèi)容存儲在日志文件和NoSQL中,也能從日志文件和NoSQL中通過反序列化得出原來的各種參數(shù)。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,消息發(fā)送與存儲,由線程池和線程處理,其中, 線程池A:監(jiān)聽指定的端口,接收消息,符合條件的消息立即發(fā)送,不符合發(fā)送條件的消息經(jīng)過篩選后發(fā)給線程B做持久化處理; 線程B:把消息和標(biāo)志域?qū)懭肴罩疚募瑯?biāo)志域有新增、修改、刪除; 線程C:把消息寫入NoSQL ; 線程D:對延遲發(fā)送或者發(fā)送失敗但未超出最遲交付時間的消息進(jìn)行重新發(fā)送。
6.根據(jù)權(quán)利要求1或4所述的方法,其特征在于,用JSON、XML>protobuf進(jìn)行序列化和反序列化。
7.根據(jù)權(quán)利要求1或2或5所述的方法,其特征在于,在序列化和反序列化時為方便后面的發(fā)送,根據(jù)開始傳輸時間和有效期計算出最遲交付時間,用最遲交付時間替換有效期,并從服務(wù)器獲取唯一的序列號做為鍵,把其余內(nèi)容做為序列化后值,將此鍵值對發(fā)給線程池A。
全文摘要
本發(fā)明公開了一種基于NoSQL的消息中間件的實現(xiàn)方法,包括緩存轉(zhuǎn)發(fā)和宕機(jī)恢復(fù)。在NoSQL中,數(shù)據(jù)的訪問控制都在內(nèi)存中進(jìn)行,讀寫速度很高。把消息存儲在NoSQL中,可保證消息緩存的高效,在對消息進(jìn)行查找時能利用內(nèi)存讀寫速度的優(yōu)勢,更快地定位消息。配合日志文件,更能保證在消息中間件服務(wù)器宕機(jī)后消息不丟失,并在重啟后能恢復(fù)宕機(jī)前的消息。
文檔編號H04L12/24GK103209214SQ20131011669
公開日2013年7月17日 申請日期2013年4月3日 優(yōu)先權(quán)日2013年4月3日
發(fā)明者柯宗貴, 柯宗慶, 楊育斌, 羅立新 申請人:藍(lán)盾信息安全技術(shù)股份有限公司