本發明實施例涉及通信技術領域,尤其涉及一種進程標記方法及裝置。
背景技術:
遠程過程調用協議,是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。遠程過程調用協議假定某些傳輸協議的存在,如tcp或udp,為通信程序之間攜帶信息數據。在osi網絡通信模型中,遠程過程調用協議跨越了傳輸層和應用層。遠程過程調用協議使得開發包括網絡分布式多程序在內的應用程序更加容易。遠程過程調用協議采用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然后等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達為止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答復信息,然后等待下一個調用信息,最后,客戶端調用進程接收答復信息,獲得進程結果,然后調用執行繼續進行。
但是,一個遠程過程調用協議的處理線程對應一個高吞吐量的分布式發布訂閱消息系統的函數,該函數用于跟蹤該線程的處理狀態,如果多個遠程過程調用協議的處理線程并發執行,將導致需要大量的高吞吐量的分布式發布訂閱消息系統的函數,造成遠程過程調用協議和異步隊列的業務消息不準確。
技術實現要素:
本發明實施例提供一種進程標記方法及裝置,以提高遠程過程調用協議和異步隊列的業務消息的準確度。
本發明實施例的一個方面是提供一種進程標記方法,包括:
將遠程過程調用協議的請求信息寫入第一序列中;
處理數據庫事務;
如果數據庫事務失敗,則移動所述第一序列的偏移坐標,所述偏移坐標用于標識所述請求信息已被處理完畢;
如果數據庫事務成功,則將所述請求信息寫入第二序列中;
如果所述請求信息成功寫入所述第二序列中,則移動所述第一序列的偏移坐標。
本發明實施例的另一個方面是提供一種進程標記裝置,包括:
寫入模塊,用于將遠程過程調用協議的請求信息寫入第一序列中;
處理模塊,用于處理數據庫事務;
移動模塊,用于當數據庫事務失敗時,移動所述第一序列的偏移坐標,所述偏移坐標用于標識所述請求信息已被處理完畢;
如果數據庫事務成功,則所述寫入模塊將所述請求信息寫入第二序列中;
如果所述請求信息成功寫入所述第二序列中,則所述移動模塊移動所述第一序列的偏移坐標。
本發明實施例提供的進程標記方法及裝置,通過把隊列技術應用到純遠程過程調用協議同步組合的微服務集群里,提高了遠程過程調用協議和異步隊列的業務消息的準確度。
附圖說明
圖1為本發明實施例提供的進程標記方法流程圖;
圖2為本發明另一實施例提供的進程標記方法流程圖;
圖3為本發明實施例提供的進程標記裝置的結構圖;
圖4為本發明另一實施例提供的進程標記裝置的結構圖。
具體實施方式
為了防止數據庫寫入成功,然后寫隊列,但是隊列寫入失敗,返回錯誤,讓上游重試,上游可能會放棄,導致消息丟失的現象,或者是數據庫寫入成功,然后全機房斷電的現象出現,也就是說我們需要防止當數據庫的事務成功時,消息一定要保證寫入隊列里,如果數據庫的事務失敗,消息不應該出現在隊列里,所以肯定不能先寫隊列,再寫數據庫,否則要讓高吞吐量的分布式發布訂閱消息系統支持消息的回滾的現象發生。本實施例提出僅依靠高吞吐量的分布式發布訂閱消息系統和mysql這兩個組件,實現數據庫與隊列的一致性的方法。
圖1為本發明實施例提供的進程標記方法流程圖。本發明實施例提供的進程標記方法具體步驟如下:
步驟s101、將遠程過程調用協議的請求信息寫入第一序列中。
在本實施例中,第一序列具體可以是頭寫入隊列,第二序列具體可以是事務隊列。遠程過程調用協議采用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然后等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達為止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答復信息,然后等待下一個調用信息,最后,客戶端調用進程接收答復信息,獲得進程結果,然后調用執行繼續進行。
在本實施例中,可以將遠程過程調用協議的請求信息寫入頭寫入隊列中,如果這個消息就寫入失敗,直接返回錯誤給調用方,讓其重試。
步驟s102、處理數據庫事務。
步驟s103、如果數據庫事務失敗,則移動所述第一序列的偏移坐標,所述偏移坐標用于標識所述請求信息已被處理完畢。
如果數據庫事務失敗,移動頭寫入隊列的偏移坐標,代表這個請求已經被處理完畢。
步驟s104、如果數據庫事務成功,則將所述請求信息寫入第二序列中。
如果數據庫事務成功,接下來寫入事務隊列這個程序。
步驟s105、如果所述請求信息成功寫入所述第二序列中,則移動所述第一序列的偏移坐標。
如果寫入隊列成功,移動頭寫入隊列的偏移坐標,代表這個請求已經被處理完畢。另外,如果寫入隊列失敗,返回成功給調用方,然后異步去重試寫入事務隊列這個程序。
在數據庫事務成功到消息寫入到事務隊列這個程序中間,頭寫入隊列的偏移坐標都是沒有被移動的,也就是如果這個過程被中斷,可以從頭寫入隊列恢復回來。經過重試,最終事務隊列寫入成功。這個時候移動頭寫入隊列的偏移坐標,標記這個請求被處理完畢。
以上過程,通過引入頭寫入隊列以及控制這個程序的偏移坐標位置,來標記完整的分布式事務是否已經被處理完成。該方法不同于以往的以數據庫的事務為標準來衡量這個處理是否完成的方法。在這個過程中沒有回滾的需求,只要數據庫寫入成功,消息隊列寫入無論如何都要成功。整個方案的關鍵是通過頭寫入隊列的寫入和偏移坐標的移動這兩個動作,標記了一個分布式事務的范圍。只要這個過程沒有完全做完,就會通過不斷重試頭寫入隊列的方式保證其最終會被完整執行。
本發明實施例通過把隊列技術應用到純遠程過程調用協議同步組合的微服務集群里,提高了遠程過程調用協議和異步隊列的業務消息的準確度。
圖2為本發明另一實施例提供的進程標記方法流程圖。在上述實施例的基礎上,本發明實施例提供的進程標記方法具體步驟如下:
步驟s201、標記每個遠程過程調用協議線程,每個遠程過程調用協議線程對應一個偏移坐標,所述偏移坐標用于標識所述遠程過程調用協議線程是否執行成功。
步驟s202、若第一遠程過程調用協議線程在第二遠程過程調用協議線程之前,所述第二遠程過程調用協議線程被成功執行,所述第一遠程過程調用協議線程沒有被執行,則不移動所述偏移坐標。
步驟s203、若第一遠程過程調用協議線程在第二遠程過程調用協議線程之前,所述第一遠程過程調用協議線程被成功執行,所述第二遠程過程調用協議線程沒有被執行,則移動所述偏移坐標。
如果要把重要的業務邏輯掛在消息隊列后面。必須要保證消息隊列里的數據的完整性,不能有丟失的情況。所以不能是把消息隊列的寫入作為一個旁路的邏輯,而是應該把消息隊列放入到主流程。如果消息隊列寫入失敗或者超時,都應該直接返回錯誤,而不是允許繼續執行。
本方案中我們將這個本地的隊列封裝到一個高吞吐量的分布式發布訂閱消息系統的代理作為本地寫入的代理,也就是說引入本地隊列作為兜底。高吞吐量的分布式發布訂閱消息系統的穩定性和延遲時常不能滿足在線服務的需要。例如,如果要可靠寫入三個副本,高吞吐量的分布式發布訂閱消息系統需要等待多個中間件的應答,這個延遲可能會有比較大的波動。在無法及時寫入的情況,所以我們需要使用本文提出的本地文件兜底的方式充當一個緩沖,實際上是通過引入本地文件隊列結合遠程分布式隊列構成一個可用性更高,延遲更低的組合隊列方案。
在沒有頭寫入隊列的時候,遠程過程調用協議執行過程如下:串行過程,因為沒有保護,所以可能被中斷,不能被確保完整執行。引入頭寫入隊列的目的就是讓這個過程變得可靠。
假設是整個處理過程,對于一個高吞吐量的分布式發布訂閱消息系統的函數是獨占的,這也就意味著有多少個遠程過程調用協議的并發處理線程(或者協程)就需要有多少個對應的函數來跟蹤對應線程的處理狀態。這樣就會變得很不經濟,需要大量的高吞吐量的分布式發布訂閱消息系統函數。但是如果讓多個遠程過程調用協議線程共享一個高吞吐量的分布式發布訂閱消息系統函數,需要新增加一個管理者單元去協調多個遠程過程調用協議線程的坐標的移動并標記事務的執行成功。具體過程如下:
遠程過程調用協議線程1,寫入了a1(頭寫入日志),其偏移坐標為1。
遠程過程調用協議線程2,寫入了a2,其偏移坐標為2。
遠程過程調用協議線程3,寫入了a3,其偏移坐標為3。
遠程過程調用協議線程3執行完畢,欲把a3標記為執行成功,移動偏移坐標到3。但是因為前面1和2,還沒有執行成功,這個時候偏移坐標不能被移動。
遠程過程調用協議線程1執行完畢,欲把a1標記為執行成功,移動偏移坐標到1。因為前面沒有尚未執行完成的a,所以這個時候偏移坐標被移動到1成功。
遠程過程調用協議線程2執行完畢,欲把a2標記為執行成功,移動偏移坐標到2。因為后面的3已經被執行完了,所以偏移坐標被直接更新為3。
步驟s204、將遠程過程調用協議的請求信息寫入第一序列中。
步驟s205、處理數據庫事務。
步驟s206、如果數據庫事務失敗,則移動所述第一序列的偏移坐標,所述偏移坐標用于標識所述請求信息已被處理完畢。
步驟s207、如果數據庫事務成功,則將所述請求信息寫入第二序列中。
步驟s208、如果所述請求信息成功寫入所述第二序列中,則移動所述第一序列的偏移坐標。
本發明實施例通過把隊列技術應用到純遠程過程調用協議同步組合的微服務集群里,提高了遠程過程調用協議和異步隊列的業務消息的準確度。
圖3為本發明實施例提供的進程標記裝置的結構圖。本發明實施例提供的進程標記裝置可以執行進程標記方法實施例提供的處理流程,如圖3所示,進程標記裝置30包括:寫入模塊31、處理模塊32、移動模塊33,其中,寫入模塊31用于將遠程過程調用協議的請求信息寫入第一序列中;處理模塊32用于處理數據庫事務;移動模塊33用于當數據庫事務失敗時,移動所述第一序列的偏移坐標,所述偏移坐標用于標識所述請求信息已被處理完畢;如果數據庫事務成功,則寫入模塊31將所述請求信息寫入第二序列中;如果所述請求信息成功寫入所述第二序列中,則移動模塊33移動所述第一序列的偏移坐標。
本發明實施例通過把隊列技術應用到純遠程過程調用協議同步組合的微服務集群里,提高了遠程過程調用協議和異步隊列的業務消息的準確度。
圖4為本發明另一實施例提供的進程標記裝置的結構圖。在上述實施例的基礎上,如果所述請求信息沒有成功寫入所述第二序列中,則寫入模塊31重新將所述請求信息寫入第二序列中。
進一步的,進程標記裝置30還包括:標記模塊34,標記模塊34用于標記每個遠程過程調用協議線程,每個遠程過程調用協議線程對應一個偏移坐標,所述偏移坐標用于標識所述遠程過程調用協議線程是否執行成功。
若第一遠程過程調用協議線程在第二遠程過程調用協議線程之前,所述第二遠程過程調用協議線程被成功執行,所述第一遠程過程調用協議線程沒有被執行,則移動模塊33不移動所述偏移坐標。
若第一遠程過程調用協議線程在第二遠程過程調用協議線程之前,所述第一遠程過程調用協議線程被成功執行,所述第二遠程過程調用協議線程沒有被執行,則移動模塊33移動所述偏移坐標。
本發明實施例提供的進程標記裝置可以具體用于執行上述圖1所提供的方法實施例,具體功能此處不再贅述。
本發明實施例通過把隊列技術應用到純遠程過程調用協議同步組合的微服務集群里,提高了遠程過程調用協議和異步隊列的業務消息的準確度。
綜上所述,本發明實施例通過把隊列技術應用到純遠程過程調用協議同步組合的微服務集群里,提高了遠程過程調用協議和異步隊列的業務消息的準確度。
在本發明所提供的幾個實施例中,應該理解到,所揭露的裝置和方法,可以通過其它的方式實現。例如,以上所描述的裝置實施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現時可以有另外的劃分方式,例如多個單元或組件可以結合或者可以集成到另一個系統,或一些特征可以忽略,或不執行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機械或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網絡單元上。可以根據實際的需要選擇其中的部分或者全部單元來實現本實施例方案的目的。
另外,在本發明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現,也可以采用硬件加軟件功能單元的形式實現。
上述以軟件功能單元的形式實現的集成的單元,可以存儲在一個計算機可讀取存儲介質中。上述軟件功能單元存儲在一個存儲介質中,包括若干指令用以使得一臺計算機設備(可以是個人計算機,服務器,或者網絡設備等)或處理器(processor)執行本發明各個實施例所述方法的部分步驟。而前述的存儲介質包括:u盤、移動硬盤、只讀存儲器(read-onlymemory,rom)、隨機存取存儲器(randomaccessmemory,ram)、磁碟或者光盤等各種可以存儲程序代碼的介質。
本領域技術人員可以清楚地了解到,為描述的方便和簡潔,僅以上述各功能模塊的劃分進行舉例說明,實際應用中,可以根據需要而將上述功能分配由不同的功能模塊完成,即將裝置的內部結構劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。上述描述的裝置的具體工作過程,可以參考前述方法實施例中的對應過程,在此不再贅述。
最后應說明的是:以上各實施例僅用以說明本發明的技術方案,而非對其限制;盡管參照前述各實施例對本發明進行了詳細的說明,本領域的普通技術人員應當理解:其依然可以對前述各實施例所記載的技術方案進行修改,或者對其中部分或者全部技術特征進行等同替換;而這些修改或者替換,并不使相應技術方案的本質脫離本發明各實施例技術方案的范圍。