李小明 廣東省郵政信息技術局,廣東 廣州 510006
多線程技術在繳費易系統中的應用
李小明 廣東省郵政信息技術局,廣東 廣州 510006
介紹了在linux平臺下c語言實現的一種線程池,并在繳費易電信充值異常處理中的得到應用。使用該線程池可以動態創建管理線程,空閑時回收資源。在電信充值異常處理的過程中起到了關鍵的作用。
電信充值;多線程;并發訪問
電信充值異常處理的過程中使用到了多進程和多線程。使用子進程負責處理主要邏輯并在子進程中創建多個線程,每個線程負責處理單獨的異常邏輯。在主進程中監控管理子進程。
進程是系統進行資源分配和調度的最小單位。進程創建通常調用fork實現。創建后子進程和父進程指向同一內存區域,當子進程有寫動作發生時,會把變動的區域拷貝到子進程新的地址空間,這樣可以在很大程度上提高創建進程的速度。
當運行一個程序時就相當于啟動了一個獨立進程。單CPU系統同時運行多個進程,需要使用并發技術,一般采用“時間片輪轉進程調度算法”,核心思想為:所有運行的進程輪流使用CPU,但每個進程允許獨占CPU的時間很短,足以讓用戶感覺不出來CPU是在輪流為多個進程服務。但實際上在任意時間點有且僅有一個進程獨占有CPU。如果是多個CPU的系統,多個進程就是可以真正的同時運行。
線程是進程的一個實體,是CPU分配和調度的最小單位。線程基本上不擁有系統資源。多線程可以使多個線程并行的工作以完成一個業務邏輯單元,這樣可以有效的提高系統效率。
交費易系統設計實現中面臨業務邏輯比較復雜、業務數據量比較大、對數據實時處理性能要求比較高、對健壯性和安全性要求比較高、要求系統跨平臺,因此設計過程中采用了以業務邏輯單元來劃分進程。一個獨立的業務邏輯可以用一個單獨的進程來運行管理。因此,將電信充值異常處理單獨設計成一個獨立進程來完成業務邏輯。
由于異常情況常常無法預料并且時有發生故需要頻繁創建銷毀線程來處理,這樣在一定程度上會消耗更多系統資源,導致效率不高,因此采用提前創建需要數量的線程并使用線程池來管理線程。
在業務處理過程中需要和第三方交費易通信,包括發送、接收報文、加密解密、驗證有效性等。進程間通訊使用套接字,這是由于使用Socket可以有效地支持分布式部署,而且可以在多種編程語言上比較容易地實現。
線程池的設計主要包括:首先在應用開始執行時從配置文件讀取線程池的大小,創建并初始化線程池,將程序處理過程關鍵信息記錄到日志中。然后,創建一個調度函數,當有新任務時創建或調度一個線程完成業務邏輯,當線程池中線程數小于最大線程數并且無閑置線程時則創建新線程,否則使用或等待有空閑線程處理。使用線程條件鎖pthread_cond_t和線程互斥鎖pthread_mutex_t對線程池進行管理。當所有線程都被占用時加鎖等待直到有空閑線程才使用空閑線程處理。最后,在使用完一個線程后放入線程池中等待繼續使用,并使用 pthread_cond_signal喚醒等待線程。當發生異常或中斷時等待所有線程處理完畢后回收線程占用的資源。
充值中如出現第三方返回超時則記錄訂單狀態為超時,并由后臺異常處理程序在獨立線程中以socket短連接的方式給第三方發送沖正申請查詢交易,如果返回成功則根據返回結果更新訂單狀態,如果超時無返回,則記錄該訂單為待沖正狀態,并由后臺沖正程序向第三方發起沖正交易。
根據線程池的設計可以在線程創建函數里調用充值異常處理函數,此函數主要包括:數據庫讀寫操作,socket通信等。數據庫操作主要包括:打開、關閉數據庫連接;讀取,修改訂單狀態;根據第三方返回值回滾額度;記錄日志及流水等。socket通信主要包括:按協議組裝發送報文及接收分解報文。
該線程池在電信業務異常處理的應用中通過在多并發,大數據量,持續性等驗證中表現穩定,為以后的項目提供了借鑒和參考的作用。
[1]鄭燕飛,余海燕. Linux 得多線程機制探討與實踐[J].計算機應用.2001
[2]周麗等.LINUX系統下多線程與多進程性能分析.微計算機信息.2005
[3]王楓,羅家融.Linux 下多線程Socket 通訊的研究與應用[J].計算機工程與應用.2004
參考文獻
[1]冼土明等.基于ZigBee-GPRS 技術的無線傳感網絡[J].軟件2011第32卷第1期:58-60
李小明(1981年04月),男,陜西漢中,軟件開發工程師,研究方向:分布式應用、應用系統架構設計開發。
10.3969/j.issn.1001-8972.2011.15.052