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