曹劍鋒 張偉
摘要:傳統的電信運營支撐系統在遇到系統性能問題,提升系統效率的時候,一般采用的是多并發機制來解決效能的不足:(1)擴展硬件配置;(2)增加硬件數量;(3)增加軟件并發。通過多并發機制一定程度上可以提升系統的性能,但會導致硬件設備無限度的增加,不論從管理維護上還是經濟效益上都是不允許的,與企業降本增效的前提也是相悖的。本研究主要是針對MBOSS中的綜合激活系統為例,借助分布式架構解決集中式系統帶來的問題,利用隊列和緩存技術,提升應用的并行接入能力和計算能力,降低高并發對應用和數據的IO壓力。根據設計的需要把龐大的系統模塊拆分成多個子功能模塊,把一個整體的功能模塊或者事務劃分成不同的子功能模塊獨立部署,異步通信,以達到提高系統效率的目的。
關鍵詞:分布式;隊列;緩存
中圖分類號:TP311.13 文獻標識碼:A 文章編號:1007-9416(2019)05-0180-02
1 關鍵技術方案分析與設計
根據調研的情況,當前IT系統均部署在Weblogic中間件上,采用Oracle數據庫,是典型的三層IOE架構,系統的擴展性取決于數據庫的性能及Weblogic的擴展性。
為了解決傳統三層IOE架構存在的問題,也是其典型的特點:軟件系統龐大復雜,擴展節點資源浪費嚴重,系統變更難度大;硬件配置要求高,基本都是小型機,財務成本高;集中架構受限于IO能力,性能無法大幅提升。我們提出了具體的設計思路:(1)利用隊列和緩存技術,提升應用的并行接入能力和計算能力,降低高并發時,對應用和數據的IO壓力。(2)針對業務量高峰期,應用優先級、核心/非核心網元分離、隊列水平擴展等方案,解決業務擁塞問題。最終提出流水式業務調度功能架構,實現系統高性能的處理方式:
(1)流程引擎與規則引擎緊密結合,使用自然的語言定義流程流向,靈活配置。(2)交互采用異步操作方式,提高系統響應速度。(3)引擎內部對頻繁訪問的熱表,采用內存表的技術,固化到內存中,極大提高流程引擎的處理速度。(4)引擎內部引用緩存隊列,緩存流程數據,提高系統性能。
2 業務隊列調度方案設計
2.1 隊列設計
系統基于內存數據庫設計相應的隊列機制。主要包括以下兩方面:
(1)基于網元建立隊列。針對不同的業務網元,需要建立不同的調度隊列,簡化了隊列的設計復雜度,將網元任務隔離開,屏蔽了不同任務的互相影響。在調度模塊處理時,可針對不同網元,部署多個模塊,以水平擴展應對業務量的不斷增長。(2)取模調度原則。應對關系型內存數據庫時,對于接口表的處理,采用關鍵字段取模的方式,多個處理模塊可掃描同一個接口表,互不影響。
2.2 多網元順序控制
系統需要對接多個不同的網元,這就存在網元的執行依賴關系。系統以預配置的方式,針對不同業務場景,對網元的先后順序進行相應編排,并將該映射關系緩存至內存中。緩存機制基于以下原則,首次接收業務請求時,將通過數據庫查詢依賴關系,并緩存至內存,后續處理相同業務時,則直接從緩存中獲取配置信息,減少IO交互,提升處理效率。
2.3 隊列優先級
隊列處理機制提供兩種方式,先進先出和優先級隊列。針對某些特定場景的業務,需要提供較高優先級以獲得更快速地處理。系統針對不同場景,設計輕量化的優先級隊列,為不同網元提供不同隊列通道,以簡化隊列需求場景,滿足優先級施工要求。
2.4 消息擁塞處理機制
隨著運營業務的不斷發展,系統需承受倍數增長的用戶請求,若保持當前軟硬件水平,終會達到極限承受點,進而造成業務擁塞。因此,系統在設計期間,充分考慮了水平擴展功能,以支撐大并發量的交易訪問。
基于分布式組件化設計,系統應用模塊設計采用進程分布劃小原則實現,每個模塊進程實現支撐業務處理過程中的一環,避免集中式的模塊處理,在運行計算過程中,由于操作系統或JVM的線程調度競爭機制限制了模塊的計算能力,無法充分利用應用服務器的CPU、內存和IO資源。
2.5 核心/非核心網元分離
在實際業務中,部分網元的執行結果并不影響整體業務的成功與否,因此需要制定相應的容錯機制,以屏蔽這些網元執行失敗帶來的影響。對于非核心網元,系統將自動識別,無需等待該類型網元施工完畢,即可認為整個工單業務施工完成,極大地加快了業務開通能力。
3 系統派單調度方案設計
系統拆分為小的功能性模塊后,最關鍵的問題是模塊間派單及消息通信的問題,需要對派單調度實現以下關鍵功能:
3.1 內存調度
消息通過內存進行調度,包括兩方面,內存數據庫和jvm內存。
利用內存數據庫隊列緩沖接口消息,避免消息直接落地,影響接口的交互性能,處理模塊可異步掃描隊列進行后續處理。同時內存中消息報文成為中心共享數據,計算處理模塊通過訪問緩沖的消息數據,完成計算處理,節省磁盤IO開銷,提升性能。
利用內存數據庫隊列交互模塊數據,上下游模塊直接通過內存讀寫,極大地提升了處理能力。
采用線程并發模式,在jvm基礎上實現多隊列,多線程處理,針對接口、模塊間消息分配jvm內存隊列,以實現派單隊列的二級緩沖,加快數據流轉。
3.2 進程守護
在分布式架構的前提下,各處理單元通常是獨立的進程,在調度隊列時,需要保證調度操作的原子性,即同一個消息,不會被重復多次調度。采用守護進程的方式,結合應用的冷備模式,確保處理單元的持續工作能力。即通過一個守護進程,定期發起對守護對象的檢查,監聽進程PID信息判斷進程是否存活,可以根據配置策略,對存活進程發起自動拉起,或者發送短信通知到系統管理員,對進程進行手工重啟。
4 緩存及異步持久化方案設計
系統高性能實現的設計原則為“一次計算,異步持久”,計算過程通過分布式應用部署,最大化利用CPU、內存和網絡IO資源完成高并發處理,利用消息管道,銜接關系型數據、內存數據庫和文件化持久操作,實現IO異步化。
基于以上原則實現的高性能系統,要實現以下關鍵功能:可根據需要選擇落入大數據平臺或轉存到集中的文件服務器當中。
4.1 利用內存數據庫緩沖報文消息
利用內存數據庫緩沖接口消息,避免消息直接落地,影響接口的交互性能;
讓消息報文成為中心共享數據,計算處理模塊通過訪問緩沖的消息數據,完成計算處理,節省磁盤IO開銷,提升性能。
4.2 配置緩存,降低IO交互
應用啟動過程加載配置數據,緩存在進程內部,有效降低計算過程中配置數據在數據庫中的訪問調用,減少應用和數據庫的交互次數,提升系統的處理能力。
4.3 嵌入式隊列,保障持久高性能
計算過程結束后,消息對象避免經網絡IO傳遞到其它模塊完成持久,實現嵌入式隊列,由計算模塊中的持久線程池完成消息處理,持久對象落地數據庫或者文件系統。
4.4 文件化系統處理大消息持久
利用文件系統的IO能力,應用程序通過隊列異步本地存儲大報文消息,避免大消息落入關系型數據庫,存放成LOB結構,可有效降低數據庫開銷,充分利用系統的整體資源。
5 流水線結構在即時開通激活系統的應用情況
去IOE架構的即時開通激活系統,整體設計借鑒了互聯網高并發高性能高擴展的設計思想,應用了業界成熟的開源解決方案,拋棄了傳統重型的EJB架構設計,改用輕量級多進程集群,運行在X86架構虛擬資源池上,歷史歸檔和過程數據分離,過程數據分功能存儲于Oracle(支持MYSQL集群),采用分布式緩存、異步IO和事件驅動等技術大幅提升性能。
在新架構中,我們引入了分布式緩存REDIS技術,每個REDIS實例均有主備節點,確保緩存數據的安全性,不僅存儲配置數據,還存儲工單處理過程數據。在激活的多進程架構下,這些緩存中的過程數據可以跨進程共享,大大降低了生產數據庫的IO消耗。
在新架構中,我們借助REDIS內存數據庫,將進程通知消息寫入內存隊列中,消費進程異步讀取,隊列性能較傳統JMS和數據庫表都提升了一個等級,消息在隊列中透明可控,維護成本也大大降低。
新架構的即時開通激活上線應用后,效果明顯:采用云化部署,效率高、容災能力強;工單處理速率高,比原系統提高10倍;表空間使用少,比原系統節約空間綜合約7倍。