一種消息處理方法和系統的制作方法
【專利摘要】本發明涉及一種消息處理方法和系統,所述方法包括:S1,接收多個外部接口并發的消息請求;S2,逐個根據消息請求的ID計算散列值;S3,將相同散列值的消息請求發送給線程池中的同一個數據處理線程處理。本發明一種消息處理方法和系統,通過接收多個外部接口并發的消息請求,然后逐個根據消息請求的ID計算散列值,最后根據散列值將具有相同散列值的消息請求發送給線程池中的同一個數據處理線程,從而保證同一消息ID的存儲操作以一致的順序導致數據庫,保證了數據的一致性。
【專利說明】
一種消息處理方法和系統
技術領域
[0001]本發明涉及計算機軟件領域,具體涉及一種消息處理方法和系統。
【背景技術】
[0002]現代企業IT系統中,越來越普及的使用消息中間件作為各子系統間的松耦合的數據交互,但與普通場景中的消息中間件應用有所區別的是:要求消息傳遞做到最大可能性的可靠性。
[0003]現有技術在消息中間件的內部處理中,為了保證消息的處理順序以及優先級、分組等條件在處理上的一致性,單個消息主題的處理是以單線程模式進行的,外部的消息收發處理過程在并發到達時需要排隊等候。為了保證數據一致性,處理消息的單線程需要在每次收發消息的處理中,同步保存到數據庫中后才返回結果給外部接口,因此,數據庫操作是處于串行的單線程處理過程中,這個過程嚴重影響單個主題的消息吞吐量。
[0004]但如果單純的把數據庫存儲操作并發進行,可能出現消費消息的更新狀態的操作限于生產消息保存操作到達,而導致更新操作失敗,進而導致最終數據的不一致:在庫中是未消費狀態而實際上是已消費。
[0005]綜上所述,現有技術存在:數據的存儲操作并發性低,且數據的一致性不能保證,以及主題消息的處理效率低。
【發明內容】
[0006]本發明所要解決的技術問題是提供一種消息處理方法和系統,能夠保證數據的一致性。
[0007]本發明解決上述技術問題的技術方案如下:一種消息處理方法,包括:
[0008]SI,接收來自多個外部接口并發的消息請求;
[0009]S2,逐個根據消息請求的ID計算散列值;
[0010]S3,將相同散列值的消息請求發送給線程池中的同一個數據處理線程處理。
[0011]本發明的有益效果是:通過接收外部消費者并發的消息請求,然后逐個根據消息請求的ID計算散列值,最后根據散列值將具有相同散列值的消息請求發送給線程池中的同一個數據處理線程,從而保證同一消息ID的存儲操作以一致的順序導致數據庫,保證了數據的一致性。
[0012]在上述技術方案的基礎上,本發明還可以做如下改進:
[0013]進一步,所述步驟SI之前還包括:在數據庫中預分配多個數據處理線程,并給所述多個數據處理線程進行編號。
[0014]采用上述進一步方案的有益效果是:通過在數據庫中預分配多個數據處理線程,并給多個數據處理線程進行編號,從而保證了消息傳遞的一致性,即具有相同ID的消息被同一個數據處理線程處理。
[0015]進一步,所述步驟S3還包括:當消息請求的散列值在數據處理線程的編號范圍內時,則將所述消息請求按照散列值發送給對應的數據處理線程。
[0016]進一步,所述步驟S3還包括:當消息請求的散列值不在數據處理線程的編號范圍內時,則按照所述消息請求的散列值與所述數據處理線程的最大編號值的余數將所述消息請求發送至線程池中對應的數據處理線程。
[0017]進一步,所述步驟S3為:
[0018]S31,將具有相同散列值的消息請求隨機發送給任一個數據處理線程,并將所述散列值作為所述數據處理線程的編號;
[0019]S32,比較下一組具有相同散列值的消息請求與已編號的數據處理線程是否相同,若相同,則將所述消息請求發送給所述已編號的數據線程;若不相同,則將所述散列值作為未編號的任一個數據處理線程的編號;
[0020]S33,繼續執行步驟S32,當所有的數據處理線程都已編號后,則判斷所述消息請求的散列值是否在數據處理線程的編號范圍內,當消息請求的散列值在數據處理線程的編號范圍內時,則將所述消息請求按照散列值發送給對應的數據處理線程;當消息請求的散列值不在數據處理線程的編號范圍內時,則按照所述消息請求的散列值與所述數據處理線程的最大編號值的余數將所述消息請求發送至線程池中對應的數據處理線程。
[0021]本發明解決上述技術問題的另一種技術方案如下:一種消息處理系統,包括:
[0022]接收模塊,用于接收多個外部接口并發的消息請求;
[0023]計算模塊,用于逐個根據消息請求的ID計算散列值;
[0024]發送模塊,用于將相同散列值的消息請求發送給線程池中的同一個數據處理線程。
[0025]本發明的有益效果是:通過接收模塊接收外部消費者并發的消息請求,然后由計算模塊逐個根據消息請求的ID計算散列值,最后由發送模塊根據散列值將具有相同散列值的消息請求發送給線程池中的同一個數據處理線程,從而保證同一消息ID的存儲操作以一致的順序導致數據庫,保證了數據的一致性。
[0026]在上述技術方案的基礎上,本發明還可以做如下改進:
[0027]進一步,還包括預分配模塊:在數據庫中預分配多個數據處理線程,并給所述多個數據處理線程進行編號。
[0028]采用上述進一步方案的有益效果是:通過預分配模塊在數據庫中預分配多個數據處理線程,并給多個數據處理線程進行編號,從而保證了消息傳遞的一致性,即具有相同ID的消息被同一個數據處理線程處理。
[0029]進一步,所述發送模塊包括第一發送單元,用于當消息請求的散列值在數據處理線程的編號范圍內時,則將所述消息請求按照散列值發送給對應的數據處理線程。
[0030]進一步,所述發送模塊還包括第二發送單元,用于當消息請求的散列值不在數據處理線程的編號范圍內時,則按照所述消息請求的散列值與所述數據處理線程的最大編號值的余數將所述消息請求發送至線程池中對應的數據處理線程。
[0031]進一步,所述發送模塊還用于,所述數據處理線程在處理完消息請求后,所述發送模塊具體按照以下方法實施:
[0032]S31,將具有相同散列值的消息請求隨機發送給任一個數據處理線程,并將所述散列值作為所述數據處理線程的編號;
[0033]S32,比較下一組具有相同散列值的消息請求與已編號的數據處理線程是否相同,若相同,則將所述消息請求發送給所述已編號的數據線程;若不相同,則將所述散列值作為未編號的任一個數據處理線程的編號;
[0034]S33,繼續執行步驟S32,當所有的數據處理線程都已編號后,則判斷所述消息請求的散列值是否在數據處理線程的編號范圍內,當消息請求的散列值在數據處理線程的編號范圍內時,則將所述消息請求按照散列值發送給對應的數據處理線程;當消息請求的散列值不在數據處理線程的編號范圍內時,則按照所述消息請求的散列值與所述數據處理線程的最大編號值的余數將所述消息請求發送至線程池中對應的數據處理線程。
【附圖說明】
[0035]圖1為本發明一種消息處理方法的流程示意圖;
[0036]圖2為本發明一種消息處理系統的結構示意圖。
【具體實施方式】
[0037]以下結合附圖對本發明的原理和特征進行描述,所舉實例只用于解釋本發明,并非用于限定本發明的范圍。
[0038]如圖1所示,一種消息處理方法,包括:
[0039]S0,在數據庫中預分配多個數據處理線程,并給所述多個數據處理線程進行編號。
[0040]SI,接收多個外部接口并發的消息請求;
[0041]S2,逐個根據消息請求的ID計算散列值;
[0042]S3,將相同散列值的消息請求發送給線程池中的同一個數據處理線程處理。
[0043]步驟S3還包括:當消息請求的散列值在數據處理線程的編號范圍內時,則將所述消息請求按照散列值發送給對應的數據處理線程。
[0044]步驟S3還包括:當消息請求的散列值不在數據處理線程的編號范圍內時,則按照所述消息請求的散列值與所述數據處理線程的最大編號值的余數將所述消息請求發送至線程池中對應的數據處理線程。
[0045]所述數據處理線程在處理完消息請求后,保存處理結果,并將處理結果返回給外部接口。
[0046]步驟S3中具體為:
[0047]S31,將具有相同散列值的消息請求隨機發送給任一個數據處理線程,并將所述散列值作為所述數據處理線程的編號;
[0048]S32,比較下一組具有相同散列值的消息請求與已編號的數據處理線程是否相同,若相同,則將所述消息請求發送給所述已編號的數據線程;若不相同,則將所述散列值作為未編號的任一個數據處理線程的編號;
[0049]S33,繼續執行步驟S32,當所有的數據處理線程都已編號后,則判斷所述消息請求的散列值是否在數據處理線程的編號范圍內,當消息請求的散列值在數據處理線程的編號范圍內時,則將所述消息請求按照散列值發送給對應的數據處理線程;當消息請求的散列值不在數據處理線程的編號范圍內時,則按照所述消息請求的散列值與所述數據處理線程的最大編號值的余數取整,將所述消息請求發送至線程池中對應的數據處理線程。
[0050]如圖2所示,一種消息處理系統,包括:
[0051]接收模塊,用于接收外部消費者并發的消息請求;
[0052]計算模塊,用于逐個根據消息請求的ID計算散列值;
[0053]發送模塊,用于將相同散列值的消息請求發送給線程池中的同一個數據處理線程。
[0054]還包括預分配模塊:在數據庫中預分配多個數據處理線程,并給所述多個數據處理線程進行編號。
[0055]發送模塊包括第一發送單元,用于當消息請求的散列值在數據處理線程的編號范圍內時,則將所述消息請求按照散列值發送給對應的數據處理線程。
[0056]發送模塊還包括第二發送單元,用于當消息請求的散列值不在數據處理線程的編號范圍內時,則按照所述消息請求的散列值與所述數據處理線程的最大編號值的余數將所述消息請求發送至線程池中對應的數據處理線程。
[0057]發送模塊還用于,所述數據處理線程在處理完消息請求后,將結果保存后再返回給外部請求者。
[0058]所述發送模塊具體按照以下方法實施:
[0059]S31,將具有相同散列值的消息請求隨機發送給任一個數據處理線程,并將所述散列值作為所述數據處理線程的編號;
[0060]S32,比較下一組具有相同散列值的消息請求與已編號的數據處理線程是否相同,若相同,則將所述消息請求發送給所述已編號的數據線程;若不相同,則將所述散列值作為未編號的任一個數據處理線程的編號;
[0061]S33,繼續執行步驟S32,當所有的數據處理線程都已編號后,則判斷所述消息請求的散列值是否在數據處理線程的編號范圍內,當消息請求的散列值在數據處理線程的編號范圍內時,則將所述消息請求按照散列值發送給對應的數據處理線程;當消息請求的散列值不在數據處理線程的編號范圍內時,則按照所述消息請求的散列值與所述數據處理線程的最大編號值的余數將所述消息請求發送至線程池中對應的數據處理線程。
[0062]以上所述僅為本發明的較佳實施例,并不用以限制本發明,凡在本發明的精神和原則之內,所作的任何修改、等同替換、改進等,均應包含在本發明的保護范圍之內。
【主權項】
1.一種消息處理方法,其特征在于,包括: Si,接收來自多個外部接口并發的消息請求; S2,逐個根據消息請求的ID計算散列值; S3,將相同散列值的消息請求發送給線程池中的同一個數據處理線程處理。2.根據權利要求1所述一種消息處理方法,其特征在于,所述步驟SI之前還包括:在數據庫中預分配多個數據處理線程,并給所述多個數據處理線程進行編號。3.根據權利要求2所述一種消息處理方法,其特征在于,所述步驟S3還包括:當消息請求的散列值在數據處理線程的編號范圍內時,則將所述消息請求按照散列值發送給對應的數據處理線程。4.根據權利要求3所述一種消息處理方法,其特征在于,所述步驟S3還包括:當消息請求的散列值不在數據處理線程的編號范圍內時,則按照所述消息請求的散列值與所述數據處理線程的最大編號值的余數將所述消息請求發送至線程池中對應的數據處理線程。5.根據權利要求1所述一種消息處理方法,其特征在于,所述步驟S3還包括: S31,將具有相同散列值的消息請求隨機發送給任一個數據處理線程,并將所述散列值作為所述數據處理線程的編號; S32,比較下一組具有相同散列值的消息請求與已編號的數據處理線程是否相同,若相同,則將所述消息請求發送給所述已編號的數據線程;若不相同,則將所述散列值作為未編號的任一個數據處理線程的編號; S33,繼續執行步驟S32,當所有的數據處理線程都已編號后,則判斷所述消息請求的散列值是否在數據處理線程的編號范圍內,當消息請求的散列值在數據處理線程的編號范圍內時,則將所述消息請求按照散列值發送給對應的數據處理線程;當消息請求的散列值不在數據處理線程的編號范圍內時,則按照所述消息請求的散列值與所述數據處理線程的最大編號值的余數將所述消息請求發送至線程池中對應的數據處理線程。6.一種消息處理系統,其特征在于,包括: 接收模塊,用于接收來自多個外部接口并發的消息請求; 消息處理模塊,用于逐個根據消息請求的ID計算散列值; 發送模塊,用于將相同散列值的消息請求發送給線程池中的同一個數據處理線程。7.根據權利要求6所述一種消息處理系統,其特征在于,還包括預分配模塊:在數據庫中預分配多個數據處理線程,并給所述多個數據處理線程進行編號。8.根據權利要求7所述一種消息處理系統,其特征在于,所述發送模塊包括第一發送單元,用于當消息請求的散列值在數據處理線程的編號范圍內時,則將所述消息請求按照散列值發送給對應的數據處理線程。9.根據權利要求8所述一種消息處理系統,其特征在于,所述發送模塊還包括第二發送單元,用于當消息請求的散列值不在數據處理線程的編號范圍內時,則按照所述消息請求的散列值與所述數據處理線程的最大編號值的余數將所述消息請求發送至線程池中對應的數據處理線程。10.根據權利要求6所述一種消息處理系統,其特征在于,所述發送模塊具體按照以下方法實施: S31,將具有相同散列值的消息請求隨機發送給任一個數據處理線程,并將所述散列值作為所述數據處理線程的編號; S32,比較下一組具有相同散列值的消息請求與已編號的數據處理線程是否相同,若相同,則將所述消息請求發送給所述已編號的數據線程;若不相同,則將所述散列值作為未編號的任一個數據處理線程的編號; S33,繼續執行步驟S32,當所有的數據處理線程都已編號后,則判斷所述消息請求的散列值是否在數據處理線程的編號范圍內,當消息請求的散列值在數據處理線程的編號范圍內時,則將所述消息請求按照散列值發送給對應的數據處理線程;當消息請求的散列值不在數據處理線程的編號范圍內時,則按照所述消息請求的散列值與所述數據處理線程的最大編號值的余數將所述消息請求發送至線程池中對應的數據處理線程。
【文檔編號】G06F17/30GK105930397SQ201610236973
【公開日】2016年9月7日
【申請日】2016年4月15日
【發明人】官元峰
【申請人】北京思特奇信息技術股份有限公司