對于一個(gè)BOSS系統(tǒng)而言,計(jì)費(fèi)賬務(wù)系統(tǒng)自然是一個(gè)相當(dāng)重要的組成部分,在整個(gè)BOSS系統(tǒng)中,最有別于別的行業(yè)的部分應(yīng)該也就是計(jì)費(fèi)賬務(wù)系統(tǒng)了,或者應(yīng)該更強(qiáng)調(diào)的說是計(jì)費(fèi)系統(tǒng)。
一般來說,計(jì)費(fèi)系統(tǒng)分為:采集、預(yù)處理、剃重、批價(jià)、詳單入庫、賬單入庫這幾個(gè)部分。
采集系統(tǒng)負(fù)責(zé)從業(yè)務(wù)網(wǎng)元獲取各種業(yè)務(wù)的服務(wù)使用記錄,很多情況下,我們都叫他們做CDR(call detail record),即使很多業(yè)務(wù)比方說是短信,并不是通話,我們也習(xí)慣上叫這些記錄做CDR或者是詳單。
采集的方式有很多,主要看網(wǎng)元的提供方式,對于電信運(yùn)營商而言,核心的業(yè)務(wù)是語音、短信和GPRS,而語音和短信的話單一般都是由交換機(jī)或者是短信平臺(tái)提供文件,在這種情況下,一般都是采集系統(tǒng)用ftp的方式來獲取這些話單文件。這里不涉及什么高深的技術(shù),大部分情況就是FTP,然后就是采集完后把已經(jīng)采集過的話單文件移到備份目錄。
這里需要提出一點(diǎn)的是交換機(jī)出話單的策略,為了更快的輸出話單,交換機(jī)一般有兩種輸出策略,第一種是按時(shí)間,第二種是按文件大小。前者的意思是多長時(shí)間輸出一個(gè)話單文件,后者的意思是當(dāng)話單文件達(dá)到多大,就輸出一個(gè)。自然,為了盡快的輸出話單,忙時(shí)應(yīng)該用第二種策略;而閑時(shí)的話,則使用的是第一種策略。
一個(gè)完整的話單包含的元素有發(fā)話時(shí)間、結(jié)束時(shí)間、主叫、被叫、發(fā)話地點(diǎn)等等。這里最要命的就是結(jié)束時(shí)間,一個(gè)完整的話單必須有結(jié)束時(shí)間,所以對于一個(gè)一直沒有掛斷的通話記錄,傳統(tǒng)的計(jì)費(fèi)系統(tǒng)是無法對這條記錄進(jìn)行批價(jià)的,這也就是為什么會(huì)出現(xiàn)當(dāng)你的卡上剩下1塊錢,只要你不掛斷電話,你可能可以打很長時(shí)間,很長時(shí)間!但是注意的是,我說的是“可能”,因?yàn)槟阒肋@個(gè)秘密,運(yùn)營商也不傻,他們會(huì)想辦法處理這個(gè)問題,至于怎么處理,我以后會(huì)慢慢寫。
預(yù)處理系統(tǒng)實(shí)際上是一個(gè)和交換廠商密切相關(guān)的領(lǐng)域。它需要做的是把各個(gè)交換機(jī)的話單格式轉(zhuǎn)換成一個(gè)統(tǒng)一的話單格式,你需要把這些交換機(jī)的話單格式都搞清楚,如此而已,幸好廠商不多,因?yàn)檫@里沒有什么標(biāo)準(zhǔn)可言,所以壟斷有時(shí)候也有點(diǎn)好處。預(yù)處理系統(tǒng)還有一個(gè)重要的功能是話單合并,因?yàn)榻粨Q機(jī)會(huì)對長話單進(jìn)行分段處理,比方說你通話超過30分鐘,交換機(jī)會(huì)30分鐘出一條話單,對于預(yù)處理系統(tǒng)則需要把這些話單進(jìn)行合并。
剃重,很多情況下,剃重會(huì)歸并到預(yù)處理系統(tǒng)里面,但是也有把他單獨(dú)拿出來說的。從字面上來說,就是把重復(fù)的話單提出掉。話單出現(xiàn)重復(fù)的原因主要是交換機(jī)的原因,交換機(jī)有時(shí)候會(huì)出現(xiàn)一個(gè)通話記錄產(chǎn)生兩條一樣的話單的情況,至于原因,我不是很清楚,呵呵。
剃重是一門很復(fù)雜的技術(shù)。但是剃重的條件實(shí)際上很簡單,就是同一時(shí)間的同一個(gè)人不能做兩件同樣的事情,就是說你不能在同時(shí)給同一個(gè)人打兩個(gè)電話。為什么說剃重是一門很復(fù)雜的技術(shù)呢,關(guān)鍵是涉及的話單量,你看看中國移動(dòng)09年一季度的財(cái)報(bào),一天凈賺2.8億!對于大部分省的移動(dòng)運(yùn)營商而言,一個(gè)月的話單都是億為單位的,每天也是千萬級。在這種海量的數(shù)據(jù)里面去迅速定位兩個(gè)重復(fù)的記錄,的確不是那么簡單的事情。可以總結(jié)出的兩種剃重技術(shù),庫外剃重和庫內(nèi)剃重,這主要看具體實(shí)現(xiàn)的方式是不是依賴數(shù)據(jù)庫的唯一索引,如果依賴,則一般叫做庫內(nèi)剃重,反之如果是通過自建數(shù)據(jù)結(jié)構(gòu)來處理叫庫外剃重。
批價(jià)系統(tǒng),很多情況下,我們會(huì)經(jīng)常聽說一批和二批這兩個(gè)詞,這兩個(gè)詞的叫法有很多種含義,說法也比較拗口,簡單舉個(gè)例子,如果你使用了一個(gè)套餐,包200分鐘的市話主叫,超出之后每分鐘2毛錢,這時(shí)你打了個(gè)4分鐘的市話,一批出來是8毛;二批發(fā)現(xiàn)如果在200分鐘內(nèi)的話,則批成0。還有一種說法是一批先批成標(biāo)準(zhǔn)資費(fèi),即每分鐘4毛,4分鐘1塊6,然后再批成0,或者是8毛。總是一批和二批的說法有這么幾種,不過,隨著系統(tǒng)的發(fā)展,一批和二批之間的界限實(shí)際上已經(jīng)越來越模糊了,越來越多的計(jì)費(fèi)系統(tǒng)都是通過一次性的批價(jià)來得出最終的結(jié)果,這是一個(gè)發(fā)展趨勢。批價(jià)系統(tǒng)是計(jì)費(fèi)系統(tǒng)里面最復(fù)雜的部分,一個(gè)計(jì)費(fèi)系統(tǒng)好不好,可能更多的是通過批價(jià)系統(tǒng)來衡量。
衡量一個(gè)批價(jià)系統(tǒng)好不好,作為一個(gè)電信級的系統(tǒng),首先當(dāng)然是系統(tǒng)安全性要高,回退、重批等功能需要具備;其次就是要靈活。眾所周知的是移動(dòng)的套餐之多,多得到了令人發(fā)指的情況,多得到了很多運(yùn)營部門的人都搞不完全清楚。如此多的套餐支持,而且美其名曰要迅速對市場部門需求做出響應(yīng),所以批價(jià)系統(tǒng)要盡量快的應(yīng)對運(yùn)營商提出的各種套餐需求。在支持這個(gè)套餐的過程中,其實(shí)運(yùn)營商是不關(guān)心你每次會(huì)不會(huì)要改代碼的,即使是口頭上說說,只要你每次改的快,他們也不在乎的,這似乎和很多人鼓吹的并不一樣,他們總會(huì)說是運(yùn)營商要求要提高計(jì)費(fèi)系統(tǒng)的可配置化。實(shí)際上是誰希望提高系統(tǒng)的可配置化呢?是集成商,集成商希望每次改套餐不要?jiǎng)哟a,由現(xiàn)場維護(hù)人員改改配置,就能搞定,這樣研發(fā)和測試就要省很多的事情。做計(jì)費(fèi)系統(tǒng)的人都知道,運(yùn)營商會(huì)要求現(xiàn)場有很多維護(hù)人員,至少是10個(gè),甚至更多,他們可以給維護(hù)費(fèi),只要你支持他的需求,出錯(cuò)能兜得住,他不會(huì)管你是怎么實(shí)現(xiàn)的,是改代碼還是修改配置?他們才不管。
關(guān)于批價(jià)系統(tǒng)說的比較多,大家還可以看看我的另外一篇文字《將lua嵌入C++中用來做計(jì)費(fèi)系統(tǒng)的批價(jià)》
詳單入庫和剃重一個(gè)道理,關(guān)鍵是性能,大量的數(shù)據(jù)入庫必然對性能的要求很高。一般的做法也可以分為兩種,庫內(nèi)和庫外。其中庫外存儲(chǔ)詳單現(xiàn)在越來越少了,雖然他的優(yōu)點(diǎn)很明顯,占用資源少,速度快,但同時(shí)缺點(diǎn)也同樣十分明顯,就是查詢和管理不方便,越來越多的開發(fā)商放棄了庫外詳單存儲(chǔ)。而借助oracle的分區(qū)技術(shù),庫內(nèi)詳單存儲(chǔ)基本上成為大部分開發(fā)商的首選方案。
詳單入庫之后就是合并賬單了,因?yàn)橘~單的特殊性,他的update操作特別多,基于性能的考慮很多開發(fā)商選擇了內(nèi)存數(shù)據(jù)庫來存儲(chǔ)。以前很多的開發(fā)商都是自己基于Unix的共享內(nèi)存技術(shù)來管理存儲(chǔ)當(dāng)月或者上月的賬單,但是最近幾年隨著Altibase和TimesTen的流行,越來越多的開發(fā)商也開始放棄自己開發(fā)的東西,轉(zhuǎn)而使用成熟的商用解決方案。一旦使用Altibase和TimesTen之后,賬單的入庫對于開發(fā)人員來說也就沒多少技術(shù)含量了。
以上是一個(gè)對計(jì)費(fèi)系統(tǒng)的簡單介紹,有不對之處請大家多多指正。