一種用於集群的消息隊列接收方法及系統的製作方法
2023-05-07 16:57:56 4
一種用於集群的消息隊列接收方法及系統的製作方法
【專利摘要】本發明公開了一種用於集群的消息隊列接收方法,其包括:以讀取獨立消息的方式從集群中的各個消息隊列讀取多個分段消息並存儲到分段消息表中;掃描分段消息表,根據分段消息中的消息Flag確定該分段消息是否為最後一段消息;根據已被確定為最後一段消息的分段消息的消息描述符計算該分段消息所屬的完整消息的總長度;將分段消息表中的各分段消息按消息ID進行排序,對具有同一消息ID的一組分段消息進行長度求和,當計算的該長度等於計算的總長度時,將該組分段消息拼接為完整消息。本發明同時公開了一種用於集群的消息隊列接收系統。本發明能夠對分散在集群的各個不同隊列中的分段消息進行拼接,確保了消息的完整性。
【專利說明】一種用於集群的消息隊列接收方法及系統
【技術領域】
[0001] 本發明涉及通信領域,更具體的,涉及一種用於集群的消息隊列的接收方法。
【背景技術】
[0002] 計算機集群簡稱集群,是一種並行或分布式處理系統。集群就是通過一組鬆散集 成的計算機相互連接,高度緊密地協作完成所需要的計算工作。其中,單個計算機通常被稱 為節點。在集群中節點進行並行處理、存儲數據、進行協同工作,使得集群對外表現為一個 整體。
[0003] 消息隊列(MQ)是一種應用程式間進行進程通信的方法。應用程式通過寫入和讀 取出入隊列的針對應用程式的數據(消息)來通信,而無需專用連接。消息傳遞指的是程 序之間通過在消息中發送數據進行通信,而不是通過遠程過程調用實現通信。隊列的使用 除去了接收和發送應用程式需要同時執行的要求,實現程序間解耦的目的。消息隊列是一 個典型的生產者、消費者模型,一端往消息隊列中不斷的寫入消息,而另一端則可以讀取或 者訂閱隊列中的消息。
[0004] MQ提供了消息分段的功能,如果消息對於應用程式來說過大,可以使用分段消息。 消息可以由應用程式或隊列管理器來分段,例如由應用程式在調用MQPUT放入消息時,使 用MQ提供的分段參數設置,將一個消息分段為多個消息放入隊列。如下是一個應用程式將 消息分段發送的示例:
[0005] MQMD. MsgType = MQMT......DATAGRAM; MQPMO. Persistence = MQPER.......PERSISTENT; 丨Γ發送第1段、笫2段……倒數笫2段 MQMD. MsgFlags = MQMF.......SEGMENT; MQPMO. Opt ions = MQPMO IDGICAL ORDER ] MQPMO SYNCP0TNT; cl so i Γ發送段 MQMD. MsgFlags = MQMF LAST SEGMENT; MQPMO.Op lions = MQPMO _______LOGICAL_______ORDER MQPMO_______SYNCP0TN 丁;
[0006]
[0007] 對於應用程式分段的消息,在調用MQGET取出消息時,使用MQ提供的參數設置,可 在分段消息全部到達時作為一個整體取出,如下是將分段消息作為整體取出的MQ參數設 置示例:
[0008] MQGM0. Options = MQGM0_SYNCP0INT
[0009] MQGM0. Options| = MQGM0_L0GICAL_0RDER
[0010] MQGMO_ALL_MSGS_AVAILABLE
[0011] MQGMO_ALL_SEGMENTS_AVAILABLE ;
[0012] MQGMO. MatchOptions = MQM0_N0NE ;
[0013] 在非集群環境下,分段消息經過傳輸隊列到達目標接收隊列,可以通過設置相關 參數,在到齊後再進行讀取,即可從接收隊列取出整個消息,多段消息可自動合併為一段作 為整體被取出。
[0014] 但是在集群環境中,分段消息如果從集群外的隊列管理器經過集群網關發送到集 群內的各節點,則不能確保一組分段消息中的各段消息都到達同一隊列管理器上的隊列, 這樣分段消息被分發到了集群中不同的隊列中,由於每個節點上消息不完整,無法通過設 置相關參數,在一組分段消息的所有分段到齊後再進行讀取。
【發明內容】
[0015] 本發明的目的是提供一種能夠用於集群環境的消息隊列分段接收方法,並能夠確 保接收的消息完整。
[0016] 為此,本發明提供了一種用於集群的消息隊列接收方法,其包括:
[0017] S1、以讀取獨立消息的方式從集群中的各個消息隊列讀取多個分段消息並存儲到 分段消息表中,所述多個分段消息來自多個不同的完整消息;
[0018] S2、掃描所述分段消息表,根據所述分段消息中的消息Flag確定該分段消息是否 為來自同一個完整消息的多個分段消息中的最後一段消息;
[0019] S3、根據已被確定為最後一段消息的所述分段消息的消息描述符計算該分段消息 所屬的完整消息的總長度並進行記錄;
[0020] S4、將所述分段消息表中的各所述分段消息按消息ID進行排序,對具有同一消息 ID的一組分段消息進行長度求和,如果計算的該長度等於步驟S3中計算的所述總長度,則 將該組分段消息拼接為所述完整消息並存儲到完整消息接收表中。
[0021] 本發明同時提供了一種用於集群的消息隊列接收系統,其包括:
[0022] 讀取單元,其配置為以讀取獨立消息的方式從集群中的各個消息隊列讀取多個分 段消息並存儲到分段消息表中,所述多個分段消息來自多個不同的完整消息;
[0023] 掃描單元,其配置為掃描所述分段消息表,並根據所述分段消息中的消息Flag確 定該分段消息是否為來自同一個完整消息的多個分段消息中的最後一段消息;
[0024] 計算單元,其配置為根據由所述掃描單元確定為最後一段消息的所述分段消息的 消息描述符計算該分段消息所屬的完整消息的總長度,以及對具有同一消息ID的一組分 段消息進行長度求和;
[0025] 拼接單元,其配置為當所述計算單元計算的長度求和值等於其計算的所述總長 度,則將該組分段消息拼接為所述完整消息並存儲到完整消息接收表中;
[0026] 存儲單元,其連接到所述讀取單元、掃描單元、計算單元和拼接單元,用於存儲所 述分段消息表、所述完整消息接收表、所述長度求和值和所述總長度。
[0027] 通過本發明的用於集群的消息隊列接收方法及系統,能夠對分散在集群的各個不 同隊列中的分段消息進行拼接,確保了消息的完整性。
【專利附圖】
【附圖說明】
[0028] 圖1是本發明的用於集群的消息隊列接收方法的流程圖;
[0029] 圖2是根據本發明的集群中接收消息隊列的整體架構示意圖;
[0030] 圖3是根據本發明的集群中接收消息隊列的過程示意圖;
[0031] 圖4是根據本發明的用於集群的消息隊列接收系統的流程圖。
【具體實施方式】
[0032] 下面參照附圖對本發明的用於集群的消息隊列接收方法和系統進行詳細說明。
[0033] 圖1是本發明的用於集群的消息隊列接收方法的流程圖;圖2是根據本發明的集 群中接收消息隊列的整體架構示意圖;圖3是根據本發明的集群中接收消息隊列的過程示 意圖。
[0034] 如圖1-3所示,本發明的用於集群的消息隊列接收方法包括步驟S1-S4 :
[0035] S1、以讀取獨立消息的方式從集群中的各個消息隊列讀取多個分段消息並存儲到 分段消息表中,該多個分段消息來自多個不同的完整消息;
[0036] 由於當MQ分段消息從集群外隊列管理器通過集群網關發送到集群內各隊列管理 器節點時,來自同一完整消息的一組分段消息中的各個分段消息被發送到了不同的隊列 上,因此本發明中在調用MQGET讀取分段消息時,不設置MQ提供的取分段消息的參數,不再 按已有的分段消息的讀取方式,而是將每個分段消息作為獨立的消息取出後,由應用程式 (例如ORACLE)進行拼接。
[0037] 以一個被應用程式分為五段的消息為例,在集群中不同的隊列按不分段的方式取 出,每段消息的消息描述MD及消息內容如下:
[0038] 第1段消息:
[0039] MsgId:X313030394343495330383032303030303030343500000000
[0040] GroupId:X414D5120514D4331303039202020202008C70A4D2069D71F
[0041] MsgSeqNumber: 1
[0042] Offset :0
[0043] MsgFlag: MQMF-SEGMENT ΓΒ
[0044] Message Len: 139
[0045] Message:
[0046] H{1:4601CIS1009999100000011 1009CCIS080200000045 20080615}
[0047] 第2段消息:
[0048] Msgld:0X313030394343495330383032303030303030343500000000
[0049] GroupId:0X414D5120514D4331303039202020202008C70A4D2069D71F
[0050] MsgSeqNumber: 1
[0051] Offset: 139
[0052] MsgFlag: MQMF-SEGMENT ΓΒ
[0053] Message Len:1048576
[0054] Message:
[0055] B{3::B11:20070821:B10:999100000011:D1A:0:D1B:RMB0:D1C:25974:D1D:RMB42 5049930:DIE (省略)
[0056] 第3段消息:
[0057] Msgld:0X313030394343495330383032303030303030343500000000
[0058] GroupId:0X414D5120514D4331303039202020202008C70A4D2069D71F
[0059] MsgSeqNumber:1
[0060] Offset:1048715
[0061] MsgFlag:MQMF_SEGMENT|~B
[0062] Message Len:1048576
[0063] Message:
[0064] B02715003311410000000000231780510022007082100111000271500331142000000 00001787805(省略)
[0065] 第4段消息:
[0066] Msgld:0X313030394343495330383032303030303030343500000000
[0067] GroupId:0X414D5120514D4331303039202020202008C70A4D2069D71F
[0068] MsgSeqNumber:1
[0069] Offset :2097291
[0070] MsgFlag:MQMF_SEGMENT|~B
[0071] Message Len:154750
[0072] Message:
[0073] B69060510122007082100111000271500352562000000000012234051012200708210 01110002715(省略)
[0074] 第5段消息:
[0075] Msgld:0X313030394343495330383032303030303030343500000000
[0076] GroupId:0X414D5120514D4331303039202020202008C70A4D2069D71F
[0077] MsgSeqNumber:1
[0078] Offset :2252041
[0079] MsgFlag:MQMF_SEGMENT|MQMF_LAST_SEGMENT|~F
[0080] Message Len:37
[0081] Message:
[0082] T{C: }
[0083] 在本發明一個實施例中,可在步驟SI中以所述分段消息的消息ID、組ID和偏移量 為主鍵,來將讀取到的所述分段消息存儲到所述分段消息表中。步驟S1還可以包括:記錄 各分段消息的消息描述符,並將分段消息正文寫入所述分段消息表的lob欄位,以備後續 拼接之用。
[0084] 本發明中的分段消息表的示例性結構如下表1所示:
[0085] 表 1
[0086]
【權利要求】
1. 一種用於集群的消息隊列接收方法,其包括: 51、 以讀取獨立消息的方式從集群中的各個消息隊列讀取多個分段消息並存儲到分段 消息表中,所述多個分段消息來自多個不同的完整消息; 52、 掃描所述分段消息表,根據所述分段消息中的消息Flag確定該分段消息是否為來 自同一個完整消息的多個分段消息中的最後一段消息; 53、 根據已被確定為最後一段消息的所述分段消息的消息描述符計算該分段消息所屬 的完整消息的總長度並進行記錄; 54、 將所述分段消息表中的各所述分段消息按消息ID進行排序,對具有同一消息ID的 一組分段消息進行長度求和,當計算的該長度等於步驟S3中計算的所述總長度時,將該組 分段消息拼接為所述完整消息並存儲到完整消息接收表中。
2. 根據權利要求1所述的消息隊列接收方法,其特徵在於,在步驟S1中,以所述分段消 息的消息ID、組ID和偏移量為主鍵,將讀取到的所述分段消息存儲到所述分段消息表中。
3. 根據權利要求2所述的消息隊列接收方法,其特徵在於,步驟S1還包括:記錄各所 述分段消息的消息描述符,並將所述分段消息正文寫入所述分段消息表的lob欄位。
4. 根據權利要求2所述的消息隊列接收方法,其特徵在於,步驟S4中的將所述分段消 息表中的各所述分段消息按消息ID進行排序包括:掃描所述分段消息表,將具有相同的所 述組ID的一組分段消息按消息ID進行排序。
5. 根據權利要求3所述的消息隊列接收方法,其特徵在於,步驟S4中的將該組分段消 息拼接為所述完整消息包括:對於所述具有同一消息ID的一組分段消息,讀取所述分段消 息表的lob欄位,按照偏移量進行排序,依次將所述lob欄位中的內容拼接起來,組成所述 完整消息。
6. -種用於集群的消息隊列接收系統,其包括: 讀取單元,其配置為以讀取獨立消息的方式從集群中的各個消息隊列讀取多個分段消 息並存儲到分段消息表中,所述多個分段消息來自多個不同的完整消息; 掃描單元,其配置為掃描所述分段消息表,並根據所述分段消息中的消息Flag確定該 分段消息是否為來自同一個完整消息的多個分段消息中的最後一段消息; 計算單元,其配置為根據由所述掃描單元確定為最後一段消息的所述分段消息的消息 描述符計算該分段消息所屬的完整消息的總長度,以及對具有同一消息ID的一組分段消 息進行長度求和; 拼接單元,其配置為當所述計算單元計算的長度求和值等於其計算的所述總長度,則 將該組分段消息拼接為所述完整消息並存儲到完整消息接收表中; 存儲單元,其連接到所述讀取單元、掃描單元、計算單元和拼接單元,用於存儲所述分 段消息表、所述完整消息接收表、所述長度求和值和所述總長度。
7. 根據權利要求6所述的消息隊列接收系統,其特徵在於,所述讀取單元具體配置為 以所述分段消息的消息ID、組ID和偏移量為主鍵而將讀取到的所述分段消息存儲到所述 分段消息表中。
8. 根據權利要求7所述的消息隊列接收系統,其特徵在於,所述讀取單元具體配置為 記錄各所述分段消息的消息描述符,並將所述分段消息正文寫入所述分段消息表的備份字 段。
9. 根據權利要求7所述的消息隊列接收系統,其特徵在於,還包括排序單元,其配置為 將所述分段消息表中的具有相同的所述組ID的一組分段消息按消息ID進行排序。
10. 根據權利要求8所述的消息隊列接收方法,其特徵在於,所述拼接單元具體配置 為:對於所述具有同一消息ID的一組分段消息,讀取所述分段消息表的lob欄位,按照偏移 量從小到大的順序,依次將所述lob欄位中的內容拼接起來,組成所述完整消息。
【文檔編號】H04L29/08GK104125283SQ201410370190
【公開日】2014年10月29日 申請日期:2014年7月30日 優先權日:2014年7月30日
【發明者】張徑姝, 施政 申請人:中國銀行股份有限公司