用于中間件消息的存儲與傳輸方法及系統的制作方法
【技術領域】
[0001]本申請涉及網絡信息處理領域,具體地說,涉及一種用于中間件消息的存儲與傳輸方法及系統。
【背景技術】
[0002]在互聯網絡的時代,信息如同大海般沒有邊際。消息中間件是分布式系統中常用的一種消息通訊的組件,主要用于系統間的解耦,是一種以消息為通訊介質并且幫助轉發消息給不同的應用的分布式系統,與郵件系統類似。參與方按角色可以分為發送消息方,消息中間件服務器和訂閱消息方。消息中間件所在服務器承擔著消息的存儲和轉發,本發明對應的正是消息存儲和消息轉發這兩塊,是消息系統的核心功能,直接影響消息系統的性能和可靠性。
[0003]目前,在市面上開源的產品有kafka,ActiveMQ等,使用本地文件或者DB(database,數據庫)做為存儲介質并實現消息的發布和訂閱。
[0004]在這些消息中間件產品中,當使用本地文件存儲時不同應用需要的消息都是獨立存儲(獨立隊列)的,多個應用需要同一條消息時需要同時存多份,并且使用B+樹作為索引存儲,隨機讀寫直接增加磁盤1的訪問頻率,并且使用java N1對文件訪問,其結果是性能較低。
[0005]當使用DB作為消息中間件存儲介質時,除了B+樹的特性帶來磁盤隨機讀寫之外還多了一層網絡訪問,當大量消息堆積時直接導致DB產生swap (服務器性能評價指標),大量的事務和鎖操作直接導致服務器性能急劇下降,DB并不適合于消息中間件,需要快速投遞消息而又能夠大量堆積消息的場景。
[0006]根據上述內容,總結得出現有的技術缺點主要包括:
[0007]1、使用B+樹作為消息存儲的索引,B+樹涉及磁盤的隨機讀寫,嚴重影響性能。
[0008]2、多個訂閱方的索引都放在一個B+樹存儲里面,當B樹膨脹之后,造成性能極低。
[0009]3、受java JVM (Java Virtual Machine, Java虛擬機)本身限制,使用本地文件存儲時緩存小,緩存命中率低。
[0010]4、當對失敗消息需要進行頻繁更新索引,由于缺少精確的流控措施,難以保證性倉急
[0011]5、當消息投遞時需要對消息進行反序列化,由于經java JVM堆傳輸到socket,所以影響性能。
[0012]針對上述問題,如何提供一種能夠解決中間件消息數據的存儲與傳輸性能低的問題,便成為亟待解決的技術問題。
【發明內容】
[0013]有鑒于此,本申請所要解決的技術問題是提供了一種用于中間件消息的存儲與傳輸方法及系統,解決了消息中間件需要快速投遞消息,而且還需要處理大量堆積消息的場旦
O
[0014]為了解決上述技術問題,本申請公開了一種用于中間件消息的存儲與傳輸方法,應用于文件庫中,其特征在于,包括:
[0015]在所述文件庫中創建數據隊列、索引隊列和指針文件,其中,該索引隊列包括對應于不同用戶的索引分區;所述數據隊列用于順序存儲用戶的數據,所述索引分區按照所屬用戶劃分,每個所述索引分區存儲該用戶在所述數據隊列中存儲的數據的索引,所述指針文件中的指針指向被讀取的數據的索引所在的所述索引分區的索引隊列位置;
[0016]監測到數據存入所述文件庫時,將該數據存入所述數據隊列中,完成后將該數據對應的索引存儲到與該數據所屬用戶相對應的所述索引隊列中;
[0017]監測到讀取所述文件庫中的數據時,從指針文件中獲取當前指針指向的索引所在的所述索引分區的索引隊列位置,并根據該索引隊列位置獲取下一條索引,通過該索引從所述數據隊列中讀取對應的數據投遞完成,并更新所述指針文件中當前指針指向的索引所在的所述索引分區的索引隊列位置。
[0018]優選地,還包括:
[0019]所述索引隊列還包括一恢復分區;
[0020]監測到讀取所述文件庫中的數據時,從指針文件中獲取當前指針指向的索引所在的所述索引分區的索引隊列位置,并根據該索引隊列位置獲取下一條索引,通過該索引從所述數據隊列中讀取對應的數據投遞失敗時,將該索引存入所述恢復分區中的索引隊列;
[0021]同時,監測到讀取所述文件庫中的數據時,所述恢復分區從所述指針文件中獲取當前恢復指針指向的恢復索引所在的所述恢復分區的索引隊列位置,并根據該索引隊列位置獲取下一條恢復索引,通過該恢復索引從所述數據隊列中讀取對應的數據投遞完成,并更新所述指針文件中當前恢復指針指向的索引所在的所述恢復分區的索引隊列位置。
[0022]優選地,還包括:
[0023]通過該恢復索引從所述數據隊列中讀取對應的數據投遞失敗時,將該恢復索引放入所述恢復分區中的索引隊列的排序執行末端。
[0024]優選地,還包括:
[0025]監控所述恢復分區中的索引隊列中的至少十個恢復索引從所述數據隊列中讀取對應的數據進行投遞的失敗率,若所述失敗率超過20%,則延時至少5秒鐘執行所述恢復分區從所述指針文件中獲取當前恢復指針指向的恢復索引所在的所述恢復分區的索引隊列位置。
[0026]優選地,所述索引分區中的索引,由文件名和文件組成,文件名為從零開始排序,排序在該文件名之后的文件名為該文件名加上該文件名對應的文件的格式大小的數值;其中,所述索引的大小為最多32個字節組成。
[0027]為了解決上述技術問題,本申請還公開了一種用于中間件消息的存儲與傳輸系統,應用于文件庫中,其特征在于,包括:存儲單元、監測單元、寫入傳輸單元和讀取傳輸單元;其中,
[0028]所述存儲單元,用于在所述文件庫中創建數據隊列、索引隊列和指針文件,其中,該索引隊列包括對應于不同用戶的索引分區;所述數據隊列用于順序存儲用戶的數據,所述索引分區按照所屬用戶劃分,每個所述索引分區存儲該用戶在所述數據隊列中存儲的數據的索引,所述指針文件中的指針指向被讀取的數據的索引所在的所述索引分區的索引隊列位置;
[0029]所述監測單元,用于監測到數據存入所述文件庫時,指示所述寫入傳輸單元;監測到讀取所述文件庫中的數據時,指示所述讀取傳輸單元;
[0030]所述寫入傳輸單元,用于將該數據存入所述存儲單元創建的數據隊列中,完成后將該數據對應的索引存儲到與該數據所屬用戶相對應的所述索引隊列中;
[0031]所述讀取傳輸單元,用于從所述存儲單元的指針文件中獲取當前指針指向的索引所在的所述索引分區的索引隊列位置,并根據該索引隊列位置獲取下一條索引,通過該索引從所述數據隊列中讀取對應的數據投遞完成,并更新所述指針文件中當前指針指向的索引所在的所述索引分區的索引隊列位置。
[0032]優選地,所述存儲單元,還用于在所述索引隊列中創建一恢復分區;
[0033]所述讀取傳輸單元,還用于從所述存儲單元的指針文件中獲取當前指針指向的索引所在的所述索引分區的索引隊列位置,并根據該索引隊列位置獲取下一條索引,通過該索引從所述數據隊列中讀取對應的數據投遞失敗時,將該索引存入所述恢復分區中的索引隊列;
[0034]同時,監測到讀取所述文件庫中的數據時,所述恢復分區從所述指針文件中獲取當前恢復指針指向的恢復索引所在的所述恢復分區的索引隊列位置,并根據該索引隊列位置獲取下一條恢復索引,通過該恢復索引從所述數據隊列中讀取對應的數據投遞完成,并更新所述指針文件中當前恢復指針指向的索引所在的所述恢復分區的索引隊列位置。
[0035]優選地,所述讀取傳輸單元,還用于通過該恢復索引從所述數據隊列中讀取對應的數據投遞失敗時,將該恢復索引放入所述存儲單元的恢復分區中的索引隊列的排序執行末端。
[0036]優選地,所述讀取傳輸單元,還用于監控所述恢復分區中的索引隊列中的至少十個恢復索引從所述數據隊列中讀取對應的數據進行投遞的失敗率,若所述失敗率超過20%,則延時至少5秒鐘執行所述恢復分區從所述指針文件中獲取當前恢復指針指向的恢復索弓I所在的所述恢復分區的索引隊列位置。
[0037]優選地,其特征在于,所述索引