一種基于磁盤緩存的消息隊列的實現(xiàn)方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明實施例涉及數(shù)據(jù)傳輸技術(shù),尤其涉及一種基于磁盤緩存的消息隊列的實現(xiàn)方法及裝置。
【背景技術(shù)】
[0002]隨著互聯(lián)網(wǎng)的快速發(fā)展,分布式系統(tǒng)的規(guī)模越來越大,應(yīng)用范圍也越來越廣。在使用多個主機(jī)(可以是終端)組成的規(guī)模較大的分布式系統(tǒng)時,多個主機(jī)之間進(jìn)行消息的可靠穩(wěn)定傳遞往往是通過消息隊列來實現(xiàn)。
[0003]目前,多個主機(jī)組成的分布式系統(tǒng)中各個主機(jī)之間的消息通過消息隊列傳遞。例如:主機(jī)A、主機(jī)B和主機(jī)C組成分布式系統(tǒng),主機(jī)A將要發(fā)送至主機(jī)B的消息寫入在主機(jī)A中創(chuàng)建的消息隊列a,主機(jī)B從消息隊列a中獲取主機(jī)A發(fā)送的消息。若主機(jī)B對所述消息進(jìn)行處理后,需要發(fā)送至主機(jī)C,則在主機(jī)B中創(chuàng)建消息隊列b,將處理后的消息寫入主機(jī)B的消息隊列b,主機(jī)C從消息隊列b中獲取主機(jī)B發(fā)送的消息。
[0004]僅使用內(nèi)存的消息隊列的存儲空間是有限的,在大量消息連續(xù)傳遞至隊列時,有可能出現(xiàn)隊列寫滿的情況。當(dāng)消息隊列寫滿的時候,可能出現(xiàn)丟棄新數(shù)據(jù)、丟棄老數(shù)據(jù)或阻塞新數(shù)據(jù)的情況,而上述情況的出現(xiàn)必然影響消息的完整性。若消息隊列不在內(nèi)存中,則消息傳遞的速度則會較慢,不能保證消息傳遞的時效性。
【發(fā)明內(nèi)容】
[0005]本發(fā)明提供一種基于磁盤緩存的消息隊列的實現(xiàn)方法及裝置,以實現(xiàn)在保障消息傳遞速度的同時保障消息完整性。
[0006]第一方面,本發(fā)明實施例提供了一種基于磁盤緩存的消息隊列的實現(xiàn)方法,包括:
[0007]創(chuàng)建監(jiān)控線程以按照預(yù)設(shè)的周期值周期性的監(jiān)控消息隊列中的消息量;
[0008]在所述消息量達(dá)到預(yù)設(shè)的消息上限值時,將再接收到的消息轉(zhuǎn)換為二進(jìn)制序列串,將所述二進(jìn)制序列串順序?qū)懭腩A(yù)先確定的磁盤文件,記錄所述磁盤文件的寫入的消息量和寫入消息的偏移位置;
[0009]在所述消息量達(dá)到預(yù)設(shè)的消息下限值時,從所述預(yù)先確定的磁盤文件中順序讀取消息,將所述消息寫入所述消息隊列,記錄讀取的消息量和讀取消息的偏移位置。
[0010]第二方面,本發(fā)明實施例還提供了一種基于磁盤緩存的消息隊列的實現(xiàn)裝置,該裝置包括:
[0011]消息監(jiān)控單元,用于創(chuàng)建監(jiān)控線程以按照預(yù)設(shè)的周期值周期性的監(jiān)控消息隊列中的消息量;
[0012]磁盤寫入單元,用于在所述消息量達(dá)到預(yù)設(shè)的消息上限值時,將再接收到的消息轉(zhuǎn)換為一.進(jìn)制序列串,將所述一.進(jìn)制序列串順序與入預(yù)先確定的磁盤文件,記錄所述磁盤文件的寫入的消息量和寫入消息的偏移位置;
[0013]消息寫入單元,用于在所述消息量達(dá)到預(yù)設(shè)的消息下限值時,從所述預(yù)先確定的磁盤文件中順序讀取消息,將所述消息寫入所述消息隊列,記錄讀取的消息量和讀取消息的偏移位置。
[0014]本發(fā)明通過創(chuàng)建監(jiān)控線程以按照預(yù)設(shè)的周期值周期性的監(jiān)控消息隊列中的消息量,將所述消息量達(dá)到預(yù)設(shè)的消息上限值之后接收到的消息轉(zhuǎn)換為二進(jìn)制序列串,將所述二進(jìn)制序列串順序?qū)懭腩A(yù)先確定的磁盤文件,在所述消息量達(dá)到預(yù)設(shè)的消息下限值時,從所述預(yù)先確定的磁盤文件中順序讀取消息,將所述消息寫入所述消息隊列,保證了在所述消息隊列寫滿之后接收到的消息緩存于磁盤文件中,在所述消息隊列中的消息量小于預(yù)設(shè)的下限值時,順序讀取上述預(yù)先確定的磁盤文件中的消息寫入所述消息隊列,而不會出現(xiàn)丟棄老數(shù)據(jù)、丟棄新數(shù)據(jù)或阻塞新數(shù)據(jù)的情況,解決分布式系統(tǒng)中多個主機(jī)之間快速傳遞消息時的完整性問題,實現(xiàn)在保障消息傳遞速度的同時保障消息完整性的效果。
【附圖說明】
[0015]圖1a是本發(fā)明實施例一中的基于磁盤緩存的消息隊列的實現(xiàn)方法的流程圖;
[0016]圖1b是本發(fā)明實施例一中的基于磁盤緩存的消息隊列的實現(xiàn)過程示意圖;
[0017]圖2是本發(fā)明實施例二中的基于磁盤緩存的消息隊列的實現(xiàn)方法中寫磁盤文件的方法的流程圖;
[0018]圖3是本發(fā)明實施例三中的基于磁盤緩存的消息隊列的實現(xiàn)方法中寫消息隊列的方法的流程圖;
[0019]圖4是本發(fā)明實施例四中的基于磁盤緩存的消息隊列的實現(xiàn)裝置的結(jié)構(gòu)示意圖。
【具體實施方式】
[0020]下面結(jié)合附圖和實施例對本發(fā)明作進(jìn)一步的詳細(xì)說明??梢岳斫獾氖?,此處所描述的具體實施例僅僅用于解釋本發(fā)明,而非對本發(fā)明的限定。另外還需要說明的是,為了便于描述,附圖中僅示出了與本發(fā)明相關(guān)的部分而非全部結(jié)構(gòu)。
[0021]實施例一
[0022]圖1a為本發(fā)明實施例一提供的一種基于磁盤緩存的消息隊列的實現(xiàn)方法的流程圖,本實施例可適用于多主機(jī)之間進(jìn)行可靠的、穩(wěn)定的消息傳遞的情況,該方法可以由基于磁盤緩存的消息隊列的實現(xiàn)裝置來執(zhí)行,該裝置被配置于上述各個主機(jī)可讀取的存儲介質(zhì)中,所述存儲介質(zhì)可以固定配置于所述主機(jī)之中,所述存儲介質(zhì)還可以是移動存儲介質(zhì),例如,所述存儲介質(zhì)可以包括R0M/RAM、磁盤或光盤等。所述方法具體包括如下步驟:
[0023]步驟110、創(chuàng)建監(jiān)控線程以按照預(yù)設(shè)的周期值周期性的監(jiān)控消息隊列中的消息量。
[0024]創(chuàng)建一監(jiān)控線程以按照預(yù)設(shè)的周期值周期性的掃描所述消息隊列,獲取所述消息隊列當(dāng)前的消息量。在接收到寫入所述消息隊列的消息時,在將所述消息寫入所述消息隊列之前,查詢所述消息隊列當(dāng)前的消息量。參見圖1b所示,若所述當(dāng)前的消息量沒有達(dá)到預(yù)設(shè)的所述消息隊列的上限值,則將所述消息寫入所述消息隊列。若所述當(dāng)前的消息量達(dá)到預(yù)設(shè)的上限值,則將所述消息寫入預(yù)先確定的磁盤文件中。其中,所述上限值是所述消息隊列能夠存儲的最大消息量,相應(yīng)的,下限值是所述消息隊列存儲的最小消息量。以Iinux系統(tǒng)自帶的消息隊列為例,消息按照先進(jìn)先出的模式進(jìn)行管理,消息隊列最大支持消息量為600,單條消息最大不超過8KB??梢园凑諏嶋H應(yīng)用的需要,預(yù)先設(shè)置所述消息隊列的上限值和下限值。
[0025]步驟120、在所述消息量達(dá)到預(yù)設(shè)的消息上限值時,將再接收到的消息轉(zhuǎn)換為二進(jìn)制序列串,將所述二進(jìn)制序列串順序?qū)懭腩A(yù)先確定的磁盤文件,記錄所述磁盤文件的寫入的消息量和寫入消息的偏移位置。
[0026]終端獲取用戶預(yù)先設(shè)置的寫磁盤文件索引,所述寫磁盤文件索引包括當(dāng)前寫磁盤文件名、當(dāng)前寫入的消息量和當(dāng)前寫入消息的位置對應(yīng)的寫指針。通過所述寫文件索引可以在程序重啟后,快速從指定的磁盤文件的指定位置開始寫入消息,以及從磁盤文件中的當(dāng)前寫入的消息量開始計數(shù)。終端根據(jù)所述寫磁盤文件索引中的當(dāng)前寫磁盤文件名打開相應(yīng)的寫磁盤文件。將所述寫磁盤索引的當(dāng)前寫入的消息量與預(yù)設(shè)的磁盤文件的最大消息量進(jìn)行比較,若所述寫磁盤文件中已寫入的消息量達(dá)到最大消息量,則關(guān)閉所述寫磁盤文件,創(chuàng)建一個新的磁盤文件作為新的寫磁盤文件,所述新的寫磁盤文件根據(jù)用戶設(shè)置的規(guī)則自動命名或提示用戶輸入文件名。例如,可以根據(jù)創(chuàng)建所述磁盤文件時的系統(tǒng)時間戳為所述磁盤文件命名,具體可以為創(chuàng)建文件時精確到毫秒級的十進(jìn)制系統(tǒng)時間戳,可以命名為1438242860243.mdt。終端打開所述寫磁盤文件,將所述寫磁盤文件索引中的當(dāng)前寫磁盤文件名更新為新的寫磁盤文件的文件名,將當(dāng)前寫入的消息量設(shè)置為0,將當(dāng)前寫指針設(shè)置為O。
[0027]在所述消息量達(dá)到預(yù)設(shè)的消息上限值之后,若終端再接收到消息,則將所述消息序列化為二進(jìn)制序列串。根據(jù)所述二進(jìn)制序列串的長度按照從小到大寫入到寫磁盤文件中,再將所述二進(jìn)制序列串按照順序?qū)懭雽懘疟P文件。這樣設(shè)計省略了解析消息的步驟,提高了寫入消息的執(zhí)行效率。每次向?qū)懘疟P文件寫入一條消息,將當(dāng)前寫入的消息量加1,并相應(yīng)的改變當(dāng)前寫入消息的位置對應(yīng)的寫指針。
[0028]步驟130、在所述消息量達(dá)到預(yù)設(shè)的消息下限值時,從所述預(yù)先確定的磁盤文件中順序讀取消息,將所述消息寫入所述消息隊列,記錄讀取的消息量和讀取消息的偏移位置。
[0029]終端獲取用戶預(yù)先設(shè)置的讀磁盤文件索引,所述讀磁盤文件索引包括當(dāng)前待讀取的磁盤文件名,當(dāng)前讀取消息的位置對應(yīng)的讀指針以及當(dāng)前讀取的消息量。通過所述讀文件索引可以在程序重啟后,快速從指定的磁盤文件的指定位置進(jìn)行消息讀取,經(jīng)讀取的消息數(shù)會從讀磁盤文件索引中記錄的當(dāng)前讀取的消息量開始計數(shù)。
[0030]所述讀磁盤文件索引或磁盤文件可能不存在,可以根據(jù)下述方法確定待讀取的磁盤文件。例如:
[0031]在讀磁盤文件索引以及待讀取的磁盤文件均存在時,根據(jù)所述讀磁盤文件索引的待讀