專利名稱:流水線多進程之間基于消息隊列的海量數(shù)據(jù)傳輸方法
技術(shù)領(lǐng)域:
本發(fā)明屬于電信運營商大規(guī)模準確數(shù)據(jù)處理應(yīng)用技術(shù)范疇,尤其涉及多進程之間基于消息隊列的海量數(shù)據(jù)傳輸方法。
背景技術(shù):
計費系統(tǒng)處理的數(shù)據(jù)都是海量數(shù)據(jù),目前中國電信運營商一般以省為單位建設(shè)計費系統(tǒng),通常1000萬用戶量的計費系統(tǒng)每月處理話單達到億數(shù)量級。如何提高系統(tǒng)處理效率,是至關(guān)重要的問題。在解決效率問題上,聯(lián)創(chuàng)計費產(chǎn)品有很多自主創(chuàng)新的方面,這里重點說明一下消息隊列在計費產(chǎn)品中進程間數(shù)據(jù)傳輸上的創(chuàng)新。
國內(nèi)外電信計費產(chǎn)品在處理海量話單數(shù)據(jù)的情況下,為了提高系統(tǒng)性能,充分利用主機多CPU的特性,采用多進程流水線處理技術(shù),實現(xiàn)話單的高效處理。流水線技術(shù)主要通過讓多個進程在同一時間上交劃重疊地并行運算和處理,以實現(xiàn)時間上的并行。
申請?zhí)枮镃N00808157.3的專利用于監(jiān)視正在計算機系統(tǒng)中執(zhí)行的應(yīng)用內(nèi)的子進程的建立和解除的方法和設(shè)備,其中每個子進程具有一個對應(yīng)的子進程數(shù)據(jù)庫結(jié)構(gòu),該正執(zhí)行應(yīng)用具有一個對應(yīng)的應(yīng)用進程數(shù)據(jù)庫結(jié)構(gòu),該方法包括提供一個用來存儲和該正執(zhí)行應(yīng)用內(nèi)的現(xiàn)存的子進程對應(yīng)的現(xiàn)存子進程數(shù)據(jù)庫結(jié)構(gòu)的表;判定該應(yīng)用執(zhí)行中何時建立新進程;檢索和該新進程對應(yīng)的新進程數(shù)據(jù)庫結(jié)構(gòu);利用該新進程數(shù)據(jù)庫結(jié)構(gòu)檢索和該新進程的父進程對應(yīng)的父進程數(shù)據(jù)庫結(jié)構(gòu);比較該父進程數(shù)據(jù)庫結(jié)構(gòu)和該應(yīng)用進程數(shù)據(jù)庫結(jié)構(gòu);若該父進程數(shù)據(jù)庫結(jié)構(gòu)和該應(yīng)用進程數(shù)據(jù)庫結(jié)構(gòu)相同,把該新進程標識為一個現(xiàn)存子進程;以及若把該新進程標識為現(xiàn)存子進程,把該新進程數(shù)據(jù)庫結(jié)構(gòu)添加到該現(xiàn)存子進程數(shù)據(jù)庫結(jié)構(gòu)表中。
一般計費產(chǎn)品業(yè)務(wù)處理流程中至少分為格式化、規(guī)整(或者稱為分揀)、排重、批價、入庫等多個進程,一條話單要順序通過一個流程中的格式化、規(guī)整、排重、批價、入庫等進程,第1條話單經(jīng)過整個流程結(jié)束以后,第2條話單才進入該流程。假設(shè)T時間內(nèi)處理一條話單,格式化、規(guī)整、排重、批價、入庫每個進程處理話單的時間為1/5的T時間,那么系統(tǒng)采用流水線技術(shù)以后,在多CPU主機環(huán)境下,不考慮系統(tǒng)IO開銷,話單處理速度將會提高5倍。然而這是很理想的狀況,因為系統(tǒng)IO開銷,會造成處理速度不能夠提高5倍。如果能避免IO開銷,那么處理速度不就提高了嗎?但是目前的計費產(chǎn)品考慮事務(wù)的一致性,考慮話單的回退,仍然采用文件傳輸?shù)姆椒▽崿F(xiàn)話單在進程間的傳輸。
在國內(nèi)外計費產(chǎn)品中,普遍使用多進程流水線并行處理技術(shù)提高系統(tǒng)處理效率。實際使用情況來看,效率提高也是比較明顯的。一個計費流程一般包括格式化、規(guī)整、排重、批價、入庫等多個進程,相當(dāng)于一個流水線中的多個崗位。原始話單文件中的話單放在計費系統(tǒng)的輸入目錄,經(jīng)歷流水線各個進程以后,最終經(jīng)入庫進程加載到數(shù)據(jù)庫中。
為什么其他廠家的計費產(chǎn)品中各個進程之間使用文件傳輸?為何系統(tǒng)不處理一條話單,就將話單送給下一進程呢?這是因為計費系統(tǒng)的穩(wěn)定性要求很高,一旦出錯,需要回退處理,回退在計費系統(tǒng)中非常復(fù)雜。所以許多計費公司無法做到回退,所以等一個文件完全處理完畢,將整個文件提交。如果將一條話單處理好了,就提交給下一進程,萬一系統(tǒng)異常宕機,一個文件中不同話單處理到什么階段很難判斷,這個文件無法重新處理,破壞了數(shù)據(jù)完整性。如果以整個文件進行提交,一個文件處理完畢才將處理結(jié)果進行提交,那么在處理過程中如果發(fā)生宕機,這個文件都沒有提交。
寫到文件里面有IO開銷,為什么不把文件內(nèi)已經(jīng)處理的話單數(shù)據(jù)放到內(nèi)存里面,一個文件處理完再提交呢?由于內(nèi)存大小是有限的,但是話單文件大小是無限的,所以一個進程沒有處理完一個文件之前,將已經(jīng)處理完的話單保存在臨時文件中,等處理完畢,再將此臨時文件改為正式文件,送給下一進程。
這種思想非常簡單,但是給系統(tǒng)帶來了IO開銷,直接影響到系統(tǒng)的處理效率。
發(fā)明內(nèi)容
本發(fā)明目的是在保證系統(tǒng)的穩(wěn)定性和數(shù)據(jù)處理完整性的前提下,采用消息隊列方式實現(xiàn)話單在進程間的傳輸,減少系統(tǒng)IO開銷,加快處理速度。
本發(fā)明技術(shù)解決方案是流水線多進程之間基于消息隊列的海量數(shù)據(jù)傳輸方法,在計費產(chǎn)品業(yè)務(wù)處理流程中一條話單順序通過至少分為格式化、規(guī)整(或者稱為分揀)、排重、批價、入庫多個進程,計費方法采用單步與整體提交相結(jié)合的機制格式化作為計費流程的源頭,將一個文件內(nèi)的話單根據(jù)分發(fā)規(guī)則分發(fā)到不同的后續(xù)流程的規(guī)整進程里面,當(dāng)結(jié)束一個文件格式化的時候,格式化進程發(fā)送此文件結(jié)束信號給各個后續(xù)的規(guī)整進程;每個規(guī)整進程接收到一個文件結(jié)束信號,就進行本進程的單步提交,說明此進程已經(jīng)處理完畢輸送到本流程的此文件的所有話單;然后規(guī)整進程將結(jié)束信號送給下一步的排重進程,排重進程同樣的處理機制,進行單步提交;排重進程和批價進程也是同樣處理方式;批價進程再將結(jié)束信號送給入庫進程,入庫進程進行單步提交;只有當(dāng)格式化將結(jié)束信息輸送的所有流程的入庫進程對這個文件進行提交完畢,系統(tǒng)才進行這個文件的整體提交;如果系統(tǒng)在處理過程中,需要中斷,這個時候一個文件在整個流水線中沒有處理完畢,那么計費進程采用不精確/模糊斷點;不精確/模糊斷點是指當(dāng)發(fā)生中斷后,計算機并不立即響應(yīng)中斷,而是等待一個文件中的所有話單完畢,才響應(yīng)該中斷;如果系統(tǒng)發(fā)生異常宕機,那么系統(tǒng)重新啟動的時候,系統(tǒng)自動發(fā)現(xiàn)有哪些文件入庫進程前的進程已經(jīng)提交,但是流水線最終進程入庫進程沒有對這個文件進行提交,那么說明這個文件在處理過程中存在問題,就進行告警;維護人員進行檢查,發(fā)現(xiàn)原因,進行這個文件的文件級回退處理文件級回退需要對整個文件在計費系統(tǒng)中各處留下的痕跡進行清理,是計費過程的逆向操作,恢復(fù)到最初狀態(tài)。
本發(fā)明計費方法充分考慮系統(tǒng)的回退,同時嚴格的提交機制,為采用消息隊列做好保證。
本發(fā)明計費方法采用單步與整體提交相結(jié)合的機制。
只有當(dāng)格式化將結(jié)束信息輸送的所有流程的入庫進程對這個文件進行提交完畢,系統(tǒng)才進行這個文件的整體提交。
流水線技術(shù)處理中斷的方法有不精確斷點法和精確斷點法兩種。不精確斷點法是指當(dāng)發(fā)生中斷后,計算機并不立即響應(yīng)中斷,而是等待一個文件中的所有話單完畢,才響應(yīng)該中斷。
事務(wù)控制技術(shù)和回退技術(shù),保證了系統(tǒng)的穩(wěn)定,也為消息隊列的引入作為技術(shù)保證。
本發(fā)明可以通過配置來實現(xiàn)在不同環(huán)境下采用的消息隊列類型;消息隊列是一個消息的鏈表;在計費系統(tǒng)中,消息就可以等同于話單,是具有特定格式的記錄;對消息隊列有寫權(quán)限的進程可以向其中按照一定的規(guī)則添加新消息;對消息隊列有讀權(quán)限的進程則可以從消息隊列中讀走消息;采用統(tǒng)一的消息隊列數(shù)據(jù)結(jié)構(gòu),就是通過標準話單的結(jié)構(gòu),任意進程之間可以通過配置,建立消息隊列,這樣靈活實現(xiàn)各個進程之間話單的傳輸;計費系統(tǒng)海量的話單數(shù)據(jù)在進程間的傳輸,全部通過消息隊列,在內(nèi)存里面實現(xiàn)。
本發(fā)明通過自動分配任務(wù),負載均衡管理,將話單分發(fā)至少相同的消息隊列,根據(jù)業(yè)務(wù)邏輯,自定義方式進行部署。
本發(fā)明特點是采用本發(fā)明方法實現(xiàn)的計費系統(tǒng)海量的話單數(shù)據(jù)在進程間的傳輸,全部通過消息隊列,處理過程可以在內(nèi)存里面實現(xiàn),沒有系統(tǒng)IO的開銷,速度大大提高。采用基于消息隊列的流水線并行處理技術(shù)方案的系統(tǒng)處理效率明顯提高。處理速度在國內(nèi)外計費廠家中名列前茅。
圖1是不同方式完成話單任務(wù)處理的時間過程示意圖。
圖2是自動分配任務(wù)處理進程圖。
圖3是本發(fā)明計費系統(tǒng)中處理流程示意圖。
具體實施例方式
如圖2所示,通過圖2中自動分配任務(wù),負載均衡管理,將話單分發(fā)至不同的消息隊列。
消息隊列就是一個消息的鏈表。在計費系統(tǒng)中,消息就可以等同于話單,是具有特定格式的記錄。對消息隊列有寫權(quán)限的進程可以向其中按照一定的規(guī)則添加新消息;對消息隊列有讀權(quán)限的進程則可以從消息隊列中讀走消息。
目前主要有兩種類型的消息隊列POSIX消息隊列以及系統(tǒng)V消息隊列,系統(tǒng)V消息隊列目前被大量使用??紤]到程序的可移植性,本發(fā)明計費方法通過配置來實現(xiàn)在不同環(huán)境下采用哪種消息隊列類型。
本發(fā)明計費流程是可以根據(jù)業(yè)務(wù)邏輯,自定義方式進行部署的,例如有些流程不需要經(jīng)過排重進程,那么直接在規(guī)整進程和批價進程之間建立消息隊列;聯(lián)創(chuàng)采用統(tǒng)一的消息隊列數(shù)據(jù)結(jié)構(gòu),就是標準話單的結(jié)構(gòu),任意進程之間可以通過配置,建立消息隊列,這樣靈活實現(xiàn)各個進程之間話單的傳輸。
計費系統(tǒng)海量的話單數(shù)據(jù)在進程間的傳輸,全部通過消息隊列,在內(nèi)存里面實現(xiàn),沒有系統(tǒng)IO的開銷,速度大大增強。
以下是計費系統(tǒng)處理效率的測試情況。
測試環(huán)境IBM P650 16*1.5G CPU,32G RAM測試對象一個省的計費話單,待入庫文件數(shù)為101724個,共有628779011條記錄。
測試方法將文件放置于系統(tǒng)輸入目錄;系統(tǒng)采用單流程(單流水線)進行測試,2種測試的區(qū)別在于第一種測試方法話單在進程間的傳輸基于文件方式,第二種測試方法話單在進程間的傳輸基于消息隊列方式;啟動計費系統(tǒng),記錄開始時間;監(jiān)控輸入目錄的文件個數(shù)直至為零,記錄結(jié)束時間。
測試結(jié)果話單基于消息隊列的進程間傳輸系統(tǒng)耗時36557秒話單基于文件的進程間傳輸系統(tǒng)耗時66362秒。
測試結(jié)論話單基于消息隊列的進程間傳輸方式下,系統(tǒng)處理效率有很大提高。如圖3所示1、首先在計費系統(tǒng)中部署處理流程,也可以稱為部署一條流水線,在流程中部署本流程涉及的進程;消息隊列的建立是自定義方式,按照業(yè)務(wù)邏輯,2個相關(guān)進程之間用黑線連接,系統(tǒng)后臺自動建立消息隊列;
2、在消息隊列屬性中配置前一進程向后續(xù)進程分發(fā)的條件;3、將流水線中所有的進程啟動起來;4、一個文件送入流水線的第一個進程即格式化進程,此進程將文件打開,讀入一條話單,處理完畢,根據(jù)條件,格式化進程通過消息隊列,發(fā)送話單到其后續(xù)的某一個規(guī)整進程,此規(guī)整進程在不斷掃描消息隊列,如果發(fā)現(xiàn)此進程和其關(guān)聯(lián)的格式化進程之間的消息隊列里面有話單,那么就立即處理,處理完畢,將話單通過消息隊列傳給滿足條件的排重進程;排重進程和批價進程、批價進和入庫進程也是同樣原理;最終入庫進程將話單送到數(shù)據(jù)庫中;5、如果某一進程處理緩慢,造成前一進程跟自身建立的消息隊列空間滿負荷,那么就會發(fā)生堵塞,前一進程無法將話單通過消息隊列傳輸過來,前一進程就進行sleep,直到此消息隊列有空間,才會繼續(xù)處理;6、格式化進程處理完一個文件的時候,就通過消息隊列,發(fā)送文件結(jié)束信息給后續(xù)的規(guī)整進程,同時進行單步提交;規(guī)整、排重、批價、入庫等進程同樣道理,收到文件結(jié)束消息,就進行本文件在該進程單步提交;7、當(dāng)所有的入庫進程收到某個文件的結(jié)束信息,系統(tǒng)進行該文件在本系統(tǒng)的整體提交。添加新消息的方式是系統(tǒng)啟動的時候創(chuàng)建消息隊列,消息隊列的內(nèi)核持續(xù)性要求每個消息隊列都在系統(tǒng)范圍內(nèi)對應(yīng)唯一的鍵值,所以,要獲得一個消息隊列的描述字,只需提供該消息隊列的鍵值即可;消息隊列描述字是由在系統(tǒng)范圍內(nèi)唯一的鍵值生成的,而鍵值可以看作對應(yīng)系統(tǒng)內(nèi)的一條路經(jīng)。
系統(tǒng)處理過程中,消息隊列存在大量的讀寫操作,對于前一進程發(fā)送消息來說,首先預(yù)置一個msgbuf緩沖區(qū)檢查消息隊列是否滿,如果滿,那么就先sleep,直到消息隊列有空余,調(diào)用相應(yīng)的發(fā)送函數(shù)即可,在系統(tǒng)V消息隊列采用msgsnd系統(tǒng)函數(shù),在POSIX消息隊列中使用mq_send系統(tǒng)函數(shù),將消息內(nèi)容發(fā)送到消息隊列中;對于后一進程讀取消息,首先分配這樣一個msgbuf緩沖區(qū),檢查消息隊列中是否有消息,如果沒有消息,就進入sleep狀態(tài),直到消息隊列中有消息,在系統(tǒng)V消息隊列采用msgrcv系統(tǒng)函數(shù),在POSIX消息隊列中使用mq_receive系統(tǒng)函數(shù),從消息隊列中將最先進入消息隊列的消息讀取出來。
圖3中通過配置來實現(xiàn)在不同環(huán)境下采用不同消息隊列(POSIX消息隊列以及系統(tǒng)V消息隊列,系統(tǒng)V消息隊列)類型的方式(消息隊列是一個消息的鏈表);
由于操作系統(tǒng)定義,一些系統(tǒng)調(diào)用會不同,首先在系統(tǒng)配置文件中需要定義操作系統(tǒng)類型,目前主流的操作系統(tǒng)包括HP UNIX、SOLARIS、LINUX和AIX,系統(tǒng)支持的標準對消息隊列有影響,存在POSIX or SYSTEM_V標準在系統(tǒng)的編譯定義文件里面配置操作系統(tǒng)類型,通過操作系統(tǒng)類型控制采用POSIX消息隊列還是SYSTEM_V消息隊列。
編譯定義文件格式如下#定義操作系統(tǒng)類型#OS_DEF=DEF_HP#OS_DEF=DEF_SOLARISOS_DEF=DEF_LINUX#OS_DEF=DEF_AIX#系統(tǒng)支持的標準,這個對消息隊列有影響#POSIX or SYSTEM_V#惠普的機器的消息隊列使用POSIX,其他的機器用SYSTEM_Vifeq($(OS_DEF),DEF_HP)SYS_TYPE=POSIXelseSYS_TYPE=SYSTEM_Vendif系統(tǒng)通過條件編譯來滿足不同定義下的消息隊列的實現(xiàn)。
采用統(tǒng)一的消息隊列數(shù)據(jù)結(jié)構(gòu),就是通過標準話單的結(jié)構(gòu),任意進程之間可以通過配置,建立消息隊列,這樣靈活實現(xiàn)各個進程之間話單的傳輸;計費系統(tǒng)海量的話單數(shù)據(jù)在進程間的傳輸,全部通過消息隊列在內(nèi)存里面實現(xiàn)。
采用統(tǒng)一的消息隊列數(shù)據(jù)結(jié)構(gòu),就是標準話單的結(jié)構(gòu),一般的話單結(jié)構(gòu)至少包括以下內(nèi)容Struct StdEvent{//原始的主叫方號碼char m_sOrgCallingNBR[40];//原始的被叫號碼
char m_sOrgCalledNBR[40];//事件起始時間char m_sStartDate[15];//事件時長int m_iDuration;}任意進程之間可以通過配置,建立消息隊列,這樣靈活實現(xiàn)各個進程之間話單的傳輸。例如存在前一進程A,后一進程B,系統(tǒng)在配置表中配置進程B的消息隊列Q的屬性,那么系統(tǒng)啟動的時候就會根據(jù)定義,建立相應(yīng)大小的消息隊列Q,屬主是進程B。同時系統(tǒng)建立分發(fā)規(guī)則配置表,配置表中是分發(fā)條件,方向是A發(fā)向B。那么進程A處理完一條話單,就會判斷此話單是否滿足分發(fā)條件,如果滿足分發(fā)條件,就把話單發(fā)向B進程的消息隊列。
權(quán)利要求
1.流水線多進程之間基于消息隊列的海量數(shù)據(jù)傳輸方法,在計費產(chǎn)品業(yè)務(wù)處理流程中一條話單順序通過至少分為格式化、規(guī)整(或者稱為分揀)、排重、批價、入庫多個進程,計費方法采用單步與整體提交相結(jié)合的機制格式化作為計費流程的源頭,將一個文件內(nèi)的話單根據(jù)分發(fā)規(guī)則分發(fā)到不同的后續(xù)流程的規(guī)整進程里面,當(dāng)結(jié)束一個文件格式化的時候,格式化進程發(fā)送此文件結(jié)束信號給各個后續(xù)的規(guī)整進程;每個規(guī)整進程接收到一個文件結(jié)束信號,就進行本進程的單步提交,說明此進程已經(jīng)處理完畢輸送到本流程的此文件的所有話單;然后規(guī)整進程將結(jié)束信號送給下一步的排重進程,排重進程同樣的處理機制,進行單步提交;排重進程和批價進程也是同樣處理方式;批價進程再將結(jié)束信號送給入庫進程,入庫進程進行單步提交;只有當(dāng)格式化將結(jié)束信息輸送的所有流程的入庫進程對這個文件進行提交完畢,系統(tǒng)才進行這個文件的整體提交;如果系統(tǒng)在處理過程中,需要中斷,這個時候一個文件在整個流水線中沒有處理完畢,那么計費進程采用不精確/模糊斷點;不精確/模糊斷點是指當(dāng)發(fā)生中斷后,計算機并不立即響應(yīng)中斷,而是等待一個文件中的所有話單完畢,才響應(yīng)該中斷;如果系統(tǒng)發(fā)生異常宕機,那么系統(tǒng)重新啟動的時候,系統(tǒng)自動發(fā)現(xiàn)有哪些文件入庫進程前的進程已經(jīng)提交,但是流水線最終進程入庫進程沒有對這個文件進行提交,那么說明這個文件在處理過程中存在問題,就進行告警;文件級回退需要對整個文件在計費系統(tǒng)中各處留下的痕跡進行清理,是計費過程的逆向操作,恢復(fù)到最初狀態(tài)。
2.根據(jù)權(quán)利要求1多進程之間基于消息隊列的海量數(shù)據(jù)傳輸方法,其特征是通過配置來實現(xiàn)在不同環(huán)境下采用不同消息隊列類型;消息隊列是一個消息的鏈表;在計費系統(tǒng)中,消息就可以等同于話單,是具有特定格式的記錄;對消息隊列有寫權(quán)限的進程可以向其中按照一定的規(guī)則添加新消息;對消息隊列有讀權(quán)限的進程則可以從消息隊列中讀走消息;采用統(tǒng)一的消息隊列數(shù)據(jù)結(jié)構(gòu),就是通過標準話單的結(jié)構(gòu),任意進程之間可以通過配置,建立消息隊列,這樣靈活實現(xiàn)各個進程之間話單的傳輸;計費系統(tǒng)海量的話單數(shù)據(jù)在進程間的傳輸,全部通過消息隊列,在內(nèi)存里面實現(xiàn)。
3.根據(jù)權(quán)利要求1多進程之間基于消息隊列的海量數(shù)據(jù)傳輸方法,其特征是自動分配任務(wù),負載均衡管理,將話單分發(fā)至不相同的消息隊列,根據(jù)業(yè)務(wù)邏輯,自定義方式進行部署。
全文摘要
流水線多進程之間基于消息隊列的海量數(shù)據(jù)傳輸方法,在計費產(chǎn)品業(yè)務(wù)處理流程中一條話單順序通過至少分為格式化、規(guī)整(或者稱為分揀)、排重、批價、入庫多個進程,計費方法采用單步與整體提交相結(jié)合的機制,通過配置來實現(xiàn)在不同環(huán)境下采用不同消息隊列類型自動分配任務(wù),負載均衡管理,將話單分發(fā)至不相同的消息隊列,根據(jù)業(yè)務(wù)邏輯,自定義方式進行部署。采用本發(fā)明方法實現(xiàn)的計費系統(tǒng)海量的話單數(shù)據(jù)在進程間的傳輸,全部通過消息隊列,處理過程可以在內(nèi)存里面實現(xiàn),沒有系統(tǒng)IO的開銷,速度大大提高。采用基于消息隊列的流水線并行處理技術(shù)方案的系統(tǒng)處理效率明顯提高。處理速度在國內(nèi)外計費廠家中名列前茅。
文檔編號H04M15/00GK101021801SQ20061009807
公開日2007年8月22日 申請日期2006年11月30日 優(yōu)先權(quán)日2006年11月30日
發(fā)明者薛慶童, 阮永江, 黃曉穎, 楊開勝, 余志剛, 莊學(xué)陽, 李巖, 李茂春 申請人:南京聯(lián)創(chuàng)科技股份有限公司