王思宇,梅巧玲,馬 杰,梁曉慷
(1. 中國鐵道科學(xué)研究院集團(tuán)有限公司 電子計(jì)算技術(shù)研究所,北京 100081;2. 中國國家鐵路集團(tuán)有限公司 客運(yùn)部,北京 100844)
中國鐵路客票發(fā)售與預(yù)訂系統(tǒng)(簡稱:客票系統(tǒng))按“中國國家鐵路集團(tuán)有限公司(簡稱:國鐵集團(tuán))—鐵路局集團(tuán)公司—站段”三級架構(gòu)建設(shè),由國鐵集團(tuán)雙活數(shù)據(jù)中心、18個(gè)鐵路局集團(tuán)公司地區(qū)中心及2 000多個(gè)車站系統(tǒng)構(gòu)成,客票系統(tǒng)部署范圍覆蓋全國鐵路所有客運(yùn)車站。長期以來,鐵路車站余票查詢服務(wù)由各鐵路局集團(tuán)公司地區(qū)中心的查詢中心承擔(dān),由于查詢中心不同,服務(wù)器性能存在差異,數(shù)據(jù)讀寫未分離,尤其在高峰期,查詢能力不足,查詢響應(yīng)慢,導(dǎo)致車站售票窗口、自動售票機(jī)及車站大屏余票查詢顯示不及時(shí),引起旅客誤解,并且,查詢中心僅能獲取本地區(qū)中心管理車次的余票信息[1-2]。
為此,本文依托客票系統(tǒng),設(shè)計(jì)鐵路車站余票查詢服務(wù)系統(tǒng),遵循高可靠性、高可用性及可擴(kuò)展性設(shè)計(jì)原則,采用快速查詢、分布式緩存、分布式內(nèi)存數(shù)據(jù)庫、多維度故障檢測等技術(shù),實(shí)現(xiàn)全國鐵路余票信息共享,支持線下的車站大屏余票查詢、自助售票機(jī)余票查詢、車站售票窗口余票查詢及線下其他應(yīng)用的余票查詢,從而提升車站余票查詢服務(wù)質(zhì)量。
車站余票查詢服務(wù)系統(tǒng)的設(shè)計(jì)依托客票系統(tǒng),由前置微服務(wù)、緩存集群、內(nèi)存集群、數(shù)據(jù)同步及配置管理中心組成,為雙中心雙活架構(gòu),如圖1所示。系統(tǒng)以超文本傳輸協(xié)議(HTTP)的方式對內(nèi)提供服務(wù)。
圖1 車站余票查詢服務(wù)系統(tǒng)架構(gòu)
(1)前置微服務(wù)
前置微服務(wù)是車站余票查詢服務(wù)系統(tǒng)接入網(wǎng)關(guān),使用微服務(wù)框架開發(fā),以HTTP的方式提供服務(wù)接口,利用負(fù)載均衡技術(shù)保證接入網(wǎng)關(guān)的可擴(kuò)展性與高可靠性,提供車站余票查詢服務(wù)[3]。
(2)緩存集群
緩存集群是基于鍵值對的非關(guān)系型數(shù)據(jù)庫,支持?jǐn)?shù)據(jù)寫入、刪除、定時(shí)自動刪除等數(shù)據(jù)操作類型。緩存集群支持從配置管理中心讀取數(shù)據(jù),自動刪除配置時(shí)間。該操作可以用于短時(shí)間內(nèi)相同請求參數(shù)的快速響應(yīng),減少內(nèi)存集群計(jì)算余票的壓力[4]。
(3)內(nèi)存集群
內(nèi)存集群為分布式內(nèi)存數(shù)據(jù)庫集群,存儲余票計(jì)算相關(guān)數(shù)據(jù)。通過請求調(diào)用,在原始余票信息基礎(chǔ)上經(jīng)過查詢條件預(yù)處理、預(yù)售期判斷、調(diào)度命令處理、共用及復(fù)用計(jì)算等多步驟的數(shù)據(jù)加工,計(jì)算出余票結(jié)果[5]。
(4)數(shù)據(jù)同步
通過客票系統(tǒng)的數(shù)據(jù)庫復(fù)制系統(tǒng),將基礎(chǔ)數(shù)據(jù)、余票數(shù)據(jù)復(fù)制到客票系統(tǒng)中間件系統(tǒng),利用消息中間件技術(shù),將數(shù)據(jù)發(fā)送到開源消息隊(duì)列中間件上,通過數(shù)據(jù)消費(fèi)解析服務(wù),將數(shù)據(jù)實(shí)時(shí)寫入內(nèi)存集群,完成客票核心數(shù)據(jù)庫數(shù)據(jù)與內(nèi)存集群的數(shù)據(jù)實(shí)時(shí)同步[6-7]。
(5)配置管理中心
配置管理中心能夠集中化管理和應(yīng)用不同環(huán)境、不同集群的配置,配置修改后能夠?qū)崟r(shí)推送到應(yīng)用端,并且具有規(guī)范的權(quán)限和流程治理功能。支持灰度發(fā)布、權(quán)限管理、發(fā)布審核及操作審計(jì)。
車站余票查詢服務(wù)系統(tǒng)的主要功能模塊包括接入服務(wù)、故障集群檢測及流量調(diào)度、風(fēng)險(xiǎn)防控、數(shù)據(jù)緩存、余票計(jì)算等。系統(tǒng)各功能模塊間的工作流程,如圖2所示。
圖2 功能模塊間的工作流程
(1)接入服務(wù)模塊
接入服務(wù)模塊支持各種業(yè)務(wù)的接入服務(wù),提供多元化定制接口功能,支持程序快速迭代升級。目前,提供車站售票窗口、自動售票機(jī)、電話訂票、車站大屏余票等業(yè)務(wù)接入服務(wù)。
(2)故障集群檢測及流量調(diào)度模塊
故障集群檢測及流量調(diào)度模塊,根據(jù)內(nèi)存集群健康指標(biāo),建立多維度內(nèi)存集群健康檢測模型,自動檢測集群健康狀態(tài),當(dāng)發(fā)現(xiàn)某個(gè)內(nèi)存集群不健康時(shí),接入服務(wù)模塊自動修改故障內(nèi)存集群的流量配置,隔離故障集群,避免影響系統(tǒng)服務(wù)。
(3)風(fēng)險(xiǎn)防控模塊
風(fēng)險(xiǎn)防控模塊提供異常請求的卡控功能,支持自定義風(fēng)險(xiǎn)卡控規(guī)則,包括對接口、請求節(jié)點(diǎn)、請求頻次多個(gè)維度的卡控規(guī)則設(shè)置。利用緩存服務(wù),將請求信息保存到緩存中,通過讀取卡控規(guī)則,卡控高頻節(jié)點(diǎn)的訪問請求[8]。
(4)數(shù)據(jù)緩存模塊
數(shù)據(jù)緩存模塊是根據(jù)不同接口的查詢量或業(yè)務(wù)需求進(jìn)行緩存規(guī)則的設(shè)置,支持單個(gè)接口自定義設(shè)置緩存規(guī)則。緩存可以減少短時(shí)間內(nèi)相同請求的余票計(jì)算次數(shù),減小內(nèi)存集群的訪問壓力,提高系統(tǒng)的穩(wěn)定性。
(5)余票計(jì)算模塊
余票計(jì)算模塊支持多維度的余票計(jì)算,例如:以發(fā)站、到站、乘車日期查詢余票結(jié)果,查詢指定日期范圍內(nèi)的途徑此車站的余票結(jié)果,查詢指定車次所有發(fā)到站的余票結(jié)果等。
車站余票查詢服務(wù)系統(tǒng)基于微服務(wù)框架開發(fā),部署一組小型服務(wù),小型服務(wù)組內(nèi)的各服務(wù)之間在結(jié)構(gòu)上松耦合,采用輕量級通信機(jī)制,實(shí)現(xiàn)緩存集群和內(nèi)存集群的數(shù)據(jù)快速查詢。并且具備統(tǒng)一的訪問接口,支持快速接口擴(kuò)展,自動升級部署,灰度發(fā)布。
緩存集群的數(shù)據(jù)存儲采用分布式內(nèi)存數(shù)據(jù)庫開源集群模式實(shí)現(xiàn),共部署3臺主機(jī),6組節(jié)點(diǎn),每組節(jié)點(diǎn)包括一個(gè)Master節(jié)點(diǎn)(可讀寫)與一個(gè)Slave節(jié)點(diǎn)(只可讀),各節(jié)點(diǎn)之間相互聯(lián)通,交換彼此的狀態(tài)信息。主從節(jié)點(diǎn)之間的數(shù)據(jù)同步分為全量與增量兩種機(jī)制,集群優(yōu)先嘗試增量同步,如果不成功則進(jìn)行全量同步,無論增量還是全量都是以異步的方式同步數(shù)據(jù)。增量同步時(shí),主備之間有毫秒級數(shù)據(jù)延遲,故障時(shí)存在少量數(shù)據(jù)丟失的情況??蛻舳四J(rèn)從Master節(jié)點(diǎn)讀取數(shù)據(jù),當(dāng)Slave節(jié)點(diǎn)故障時(shí),對業(yè)務(wù)無影響,當(dāng)Master節(jié)點(diǎn)出現(xiàn)故障時(shí),集群會重新選舉一個(gè)Slave節(jié)點(diǎn)提升為Master節(jié)點(diǎn)(默認(rèn)10 s),保證業(yè)務(wù)的正常運(yùn)行。
多維度故障檢測技術(shù)實(shí)現(xiàn)智能化的內(nèi)存集群故障檢測。本文主要對內(nèi)存使用率、數(shù)據(jù)準(zhǔn)確率、請求超時(shí)率進(jìn)行分析,確定集群健康指標(biāo)。
(1)內(nèi)存使用率
內(nèi)存集群在啟動時(shí),會分配一定大小的內(nèi)存;集群運(yùn)行時(shí),會實(shí)時(shí)檢測集群的內(nèi)存使用情況。當(dāng)數(shù)據(jù)存儲使用內(nèi)存和集群運(yùn)行使用內(nèi)存的總和大于分配內(nèi)存的85%時(shí),集群處于亞健康狀態(tài)。
(2)數(shù)據(jù)準(zhǔn)確率
內(nèi)存集群的數(shù)據(jù)是實(shí)時(shí)更新的,每售出一張票,就產(chǎn)生一條更新余票數(shù)據(jù),通過數(shù)據(jù)同步中間件獲取消息并寫入內(nèi)存集群。內(nèi)存集群數(shù)據(jù)不準(zhǔn)確時(shí),會影響旅客的余票查詢。
(3)請求超時(shí)率
當(dāng)客戶端向作為服務(wù)端的內(nèi)存集群發(fā)出請求時(shí),內(nèi)存集群會根據(jù)請求參數(shù)進(jìn)行余票計(jì)算,并快速響應(yīng)客戶端的請求,客戶端和服務(wù)端均設(shè)置了響應(yīng)超時(shí)時(shí)間。通過實(shí)時(shí)采集集群響應(yīng)時(shí)間數(shù)據(jù),監(jiān)控集群請求響應(yīng)情況,當(dāng)集群請求響應(yīng)超時(shí)達(dá)到一定比例時(shí),集群處于不健康狀態(tài)。
(4)最大承載請求量
根據(jù)業(yè)務(wù)邏輯復(fù)雜程度,內(nèi)存集群的最大承載請求量不同,最大承載請求量也是內(nèi)存集群的性能極限,超出此極限,會導(dǎo)致請求超時(shí),或集群宕機(jī)。
根據(jù)集群內(nèi)存使用率、數(shù)據(jù)準(zhǔn)確率、請求超時(shí)率及最大承載請求量多維度進(jìn)行故障判定,檢測間隔可自定義配置,目前配置為15 s循環(huán)檢測一次。故障判定結(jié)果作為集群故障隔離的觸發(fā)條件,具體判定流程如圖3所示。
分布式內(nèi)存數(shù)據(jù)庫將內(nèi)存劃分為若干的數(shù)據(jù)區(qū)域和數(shù)據(jù)單元,根據(jù)數(shù)據(jù)特點(diǎn),設(shè)置存儲規(guī)則,可按照一定規(guī)則分散存儲在多臺獨(dú)立設(shè)備的內(nèi)存中,也可同時(shí)存儲在所有節(jié)點(diǎn)中。
(1)基于車次的余票數(shù)據(jù)分布式存儲
圖3 多維度故障檢測流程
內(nèi)存集群提供余票計(jì)算服務(wù),基于車次進(jìn)行分布式存儲,將余票計(jì)算所需的相關(guān)基礎(chǔ)數(shù)據(jù)及車次余票數(shù)據(jù)存放在內(nèi)存中。在進(jìn)行余票計(jì)算時(shí),利用分布式系統(tǒng)中的資源定位技術(shù)快速檢索數(shù)據(jù),可以同時(shí)計(jì)算多個(gè)車次的余票,并返回結(jié)果,提高了系統(tǒng)的可靠性、可用性和存取效率。同時(shí),分布式存儲也便于內(nèi)存集群節(jié)點(diǎn)的擴(kuò)充,只需要在增加節(jié)點(diǎn)后,將集群的數(shù)據(jù)重新分配即可。
(2)內(nèi)存分布式計(jì)算
在進(jìn)行余票計(jì)算時(shí),直接從內(nèi)存中讀取余票數(shù)據(jù),在中央處理器(CPU)中完成余票計(jì)算,不存在輸入/輸出方面的瓶頸。內(nèi)存集群支持“發(fā)站+到站+日期”“查詢天數(shù)+發(fā)站”等多種方式余票查詢,同時(shí),內(nèi)存集群根據(jù)請求參數(shù)計(jì)算出需要計(jì)算余票的所有車次,根據(jù)車次的余票數(shù)據(jù)分布式存儲規(guī)則,將需要計(jì)算余票的車次分發(fā)到車次數(shù)據(jù)所在的節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)只與自己內(nèi)存單元中關(guān)聯(lián)的數(shù)據(jù)進(jìn)行計(jì)算,計(jì)算完成后匯總到請求所在的節(jié)點(diǎn),將所有結(jié)果整理匯總,返回給客戶端,完成一次查詢請求的余票計(jì)算。即一次查詢請求是由多個(gè)節(jié)點(diǎn)“合力”完成的,可以通過擴(kuò)充集群中的節(jié)點(diǎn)數(shù)量提升集群處理能力。
車站余票查詢服務(wù)系統(tǒng)實(shí)現(xiàn)了鐵路車站售票窗口、自動售票機(jī)、車站大屏、電話訂票的余票查詢功能,支持多種類型的余票查詢,具有通用性、可擴(kuò)展性。原來使用鐵路局集團(tuán)公司地區(qū)中心的查詢中心進(jìn)行余票查詢時(shí),車站的大屏余票單次查詢時(shí)間較長,甚至幾十秒、幾分鐘才能完成一次查詢。使用鐵路車站余票查詢系統(tǒng)進(jìn)行余票查詢,可以將單次查詢時(shí)間縮短幾百倍,滿足多個(gè)車站同時(shí)、實(shí)時(shí)刷新大屏幕余票信息的需求,降低了對傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的依賴。系統(tǒng)測試主要分為內(nèi)存集群初始化性能測試和系統(tǒng)驗(yàn)證性測試兩方面。
內(nèi)存集群初始化是系統(tǒng)擴(kuò)展內(nèi)存集群和集群日常運(yùn)維的重要操作,其性能影響系統(tǒng)運(yùn)維的復(fù)雜程度及快速進(jìn)行系統(tǒng)資源擴(kuò)展的效率。根據(jù)內(nèi)存集群業(yè)務(wù)特點(diǎn),內(nèi)存集群擴(kuò)建主要包括無數(shù)據(jù)集群重啟、集群數(shù)據(jù)導(dǎo)入、集群索引創(chuàng)建3項(xiàng)操作;內(nèi)存集群日常運(yùn)維包括全量數(shù)據(jù)集群重啟。因此,初始化操作的性能測試內(nèi)容為以下4項(xiàng):
(1)無數(shù)據(jù)集群重啟耗時(shí)及資源使用情況;
(2)集群初始化導(dǎo)入數(shù)據(jù)耗時(shí)及資源使用情況;
(3)集群創(chuàng)建索引耗時(shí)及資源使用情況;
(4)全量數(shù)據(jù)集群重啟耗時(shí)及資源使用情況。
內(nèi)存集群初始化性能測試采用真實(shí)的生產(chǎn)數(shù)據(jù),內(nèi)存集群規(guī)模為8臺機(jī)器,每臺機(jī)器有4個(gè)節(jié)點(diǎn),共32個(gè)節(jié)點(diǎn)組成一個(gè)分布式內(nèi)存集群。結(jié)合12306互聯(lián)網(wǎng)售票系統(tǒng)中內(nèi)存集群初始化性能及運(yùn)維需求,測試項(xiàng)及耗時(shí)如表1所示,滿足預(yù)期要求。
表1 內(nèi)存集群初始化性能測試情況
驗(yàn)證性測試(POC)是指針對客戶具體應(yīng)用的驗(yàn)證性測試,可以真實(shí)地模擬用戶請求,便于驗(yàn)證系統(tǒng)方案是否滿足用戶需求。采用Jmeter開源性能測試工具,測試客戶端為本地服務(wù)器,測試場景為客戶端請求車站余票查詢接口,測試壓力線程數(shù)為200條,測試用例為前100個(gè)熱門發(fā)到站查詢組合,測試時(shí)間為 1 h。
根據(jù)日志統(tǒng)計(jì),近幾年全國鐵路所有車站余票查詢總量的最大峰值事務(wù)處理量為200次/s,查詢結(jié)果耗時(shí)在秒級。測試預(yù)期為系統(tǒng)的每秒事務(wù)處理量(TPS)不低于200次,同時(shí),系統(tǒng)響應(yīng)時(shí)間(RT)在秒級以下。
測試結(jié)果如圖4、圖5所示,圖4、圖5的橫坐標(biāo)表示測試時(shí)間,圖4的縱坐標(biāo)表示TPS,單位為次,圖5的縱坐標(biāo)表示RT,單位為 ms。由TPS和RT趨勢圖可以看出,系統(tǒng)在測試時(shí)間1 h內(nèi),TPS均值為3 000次左右,遠(yuǎn)高于系統(tǒng)需求的200次,RT均值為40 ms,由秒級降為毫秒級,整體響應(yīng)時(shí)間趨勢平穩(wěn),查詢結(jié)果耗時(shí)更短,滿足測試預(yù)期要求。
圖4 TPS 趨勢
圖5 RT 趨勢
目前,車站余票查詢服務(wù)系統(tǒng)已應(yīng)用在全國鐵路的售票窗口、自動售票機(jī)、車站大屏及集中電話訂票系統(tǒng)中,為車站售票提供可靠、安全的服務(wù)。隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展、客票系統(tǒng)的架構(gòu)優(yōu)化,車站余票查詢服務(wù)系統(tǒng)也將進(jìn)行架構(gòu)調(diào)整、技術(shù)革新,不斷提高系統(tǒng)的穩(wěn)定性和可靠性。