李永進(jìn) 田 豐 倪兆陽(yáng)
1(中國(guó)民航信息網(wǎng)絡(luò)股份有限公司研發(fā)中心 北京 100000)2(中國(guó)民航大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 天津 300000)
?
面向高并發(fā)復(fù)雜民航業(yè)務(wù)的服務(wù)器架構(gòu)設(shè)計(jì)
李永進(jìn)1田豐1倪兆陽(yáng)2
1(中國(guó)民航信息網(wǎng)絡(luò)股份有限公司研發(fā)中心北京 100000)2(中國(guó)民航大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院天津 300000)
摘要針對(duì)民航業(yè)務(wù)實(shí)時(shí)并發(fā)請(qǐng)求多、業(yè)務(wù)功能復(fù)雜多變、數(shù)據(jù)量大、可靠性要求高等業(yè)務(wù)特點(diǎn),分析當(dāng)前流行的服務(wù)器架構(gòu)的優(yōu)缺點(diǎn),將服務(wù)劃分階段,在民航旅客服務(wù)信息系統(tǒng)中引入分階段的事件驅(qū)動(dòng)架構(gòu)SEDA(Staged Event-Driven Architecture),并進(jìn)行實(shí)驗(yàn)對(duì)比驗(yàn)證。實(shí)驗(yàn)結(jié)果表明,基于SEDA的服務(wù)器軟件架構(gòu)比基于線程池模型的服務(wù)器軟件架構(gòu)擁有更好的處理高并發(fā)請(qǐng)求的能力,能夠使大規(guī)模民航旅客服務(wù)信息系統(tǒng)有效應(yīng)對(duì)高并發(fā)高負(fù)載環(huán)境。
關(guān)鍵詞SEDA服務(wù)器架構(gòu)中間件民航旅客服務(wù)信息系統(tǒng)異步調(diào)用
0引言
隨著經(jīng)濟(jì)社會(huì)的發(fā)展,互聯(lián)網(wǎng)變得觸手可及,網(wǎng)絡(luò)上的流量也增加了許多倍,這對(duì)于提供各種服務(wù)的服務(wù)器是一個(gè)不小的挑戰(zhàn),未來(lái)網(wǎng)絡(luò)服務(wù)器的任務(wù)將更加繁重。雖然隨著時(shí)間的推移計(jì)算機(jī)硬件在不斷發(fā)展,服務(wù)器的性能有了很大提升,但仍然難以滿足大量的并發(fā)訪問(wèn)對(duì)性能的要求。同時(shí),全球各地的用戶(hù)經(jīng)常以碎片化、互相近似的形式向服務(wù)器發(fā)出請(qǐng)求, 用戶(hù)請(qǐng)求在高峰時(shí)段會(huì)超過(guò)平均值的8到10倍[1],服務(wù)器的處理能力通常不能承受這樣的負(fù)載,以至于其響應(yīng)時(shí)間將會(huì)大大增加,吞吐量嚴(yán)重降低,更有甚者還會(huì)停止服務(wù),提供給用戶(hù)的服務(wù)質(zhì)量很難得到保證。
互聯(lián)網(wǎng)及航空業(yè)的不斷發(fā)展使得越來(lái)越多的人選擇從互聯(lián)網(wǎng)獲得關(guān)于航班的各種信息。民航業(yè)自身的發(fā)展也要求其信息化程度逐步提高,這意味著越來(lái)越多的民航業(yè)務(wù)要由信息系統(tǒng)處理。
民航旅客服務(wù)信息系統(tǒng)對(duì)可靠性要求極高,信息系統(tǒng)的運(yùn)行狀況不僅僅關(guān)系到提供給地面用戶(hù)的服務(wù)質(zhì)量,還涉及到空中的交通安全和全國(guó)各航空公司的飛行計(jì)劃安排,一旦出現(xiàn)差錯(cuò)將造成大量的旅客滯留和航班延誤,其損失是不可估量的。
民航旅客服務(wù)系統(tǒng)需要面向全國(guó)用戶(hù),請(qǐng)求數(shù)量龐大,而且民航業(yè)務(wù)復(fù)雜,一個(gè)民航業(yè)務(wù)請(qǐng)求往往需要多個(gè)服務(wù)協(xié)同工作才能完成,這對(duì)民航旅客服務(wù)信息系統(tǒng)的處理能力提出了極大的挑戰(zhàn)。同時(shí)根據(jù)SOA的要求還需要提高民航軟件復(fù)用度,實(shí)現(xiàn)業(yè)務(wù)功能靈活定制。
這就要求民航旅客服務(wù)信息系統(tǒng)能夠良好地應(yīng)對(duì)高并發(fā)高負(fù)載環(huán)境,通過(guò)服務(wù)整合機(jī)制實(shí)現(xiàn)應(yīng)用間的消息通信,形成面向用戶(hù)的實(shí)際業(yè)務(wù)功能。提高現(xiàn)有服務(wù)器對(duì)高并發(fā)、動(dòng)態(tài)變化、連續(xù)高可靠性的適應(yīng)能力以及對(duì)其他需求的應(yīng)對(duì)能力成為當(dāng)前的重要任務(wù)。
除了計(jì)算機(jī)硬件性能以外,服務(wù)器的軟件架構(gòu)也會(huì)對(duì)服務(wù)器性能產(chǎn)生重要影響。優(yōu)秀的軟件架構(gòu)能夠充分發(fā)揮出計(jì)算機(jī)的硬件性能,提高軟件的可重用性,降低軟件開(kāi)發(fā)和維護(hù)成本,為企業(yè)帶來(lái)豐厚的經(jīng)濟(jì)效益。因此有必要設(shè)計(jì)一款先進(jìn)的軟件架構(gòu)為企業(yè)的應(yīng)用開(kāi)發(fā)和服務(wù)復(fù)用提供基礎(chǔ)服務(wù),使民航旅客服務(wù)信息系統(tǒng)支持高并發(fā)高負(fù)載復(fù)雜民航業(yè)務(wù),支持軟件復(fù)用,滿足民航業(yè)務(wù)對(duì)系統(tǒng)通用性和靈活性的需求。
1研究現(xiàn)狀
目前的交易處理服務(wù)器軟件架構(gòu)主要基于三種模型。第一種是線程池模型[2],為每個(gè)請(qǐng)求分配一個(gè)線程;第二種是事件驅(qū)動(dòng)(Event-Driven)處理模型[3],由一個(gè)調(diào)度器控制消息的處理流程;第三種是SEDA模型[1,4],將處理流程劃分成不同的處理階段,階段之間用事件隊(duì)列連接。
1.1線程池模型
線程池模型充分體現(xiàn)了操作系統(tǒng)對(duì)多線程技術(shù)的支持,通過(guò)多線程實(shí)現(xiàn)處理器、輸入輸出資源的多路復(fù)用,從而實(shí)現(xiàn)高并發(fā)處理,也可以通過(guò)重用已經(jīng)創(chuàng)建好的線程來(lái)降低新建和銷(xiāo)毀線程的開(kāi)銷(xiāo)[5]。系統(tǒng)中由一個(gè)主線程dispatcher專(zhuān)門(mén)負(fù)責(zé)給線程池的其他線程分派任務(wù),如圖1所示。每個(gè)線程完成它所處理的任務(wù)的所有業(yè)務(wù)邏輯,如執(zhí)行查詢(xún)數(shù)據(jù)庫(kù)請(qǐng)求的所有邏輯步驟,然后再等待新的請(qǐng)求。該模型容易實(shí)現(xiàn)且應(yīng)用廣泛,其處理邏輯以阻塞方式進(jìn)行工作。在這種模型下,如果大量的線程因?yàn)榈却硞€(gè)事件的完成而被阻塞(比如等待磁盤(pán)IO、等待其他服務(wù)返回結(jié)果等),就會(huì)使其他新到的請(qǐng)求得不到及時(shí)處理。
圖1 線程池模型
1.2事件驅(qū)動(dòng)處理模型
事件驅(qū)動(dòng)處理模型將請(qǐng)求表示成一個(gè)有限狀態(tài)機(jī)FSM(Finite State Machine),根據(jù)請(qǐng)求的當(dāng)前狀態(tài)進(jìn)行相應(yīng)的處理。系統(tǒng)中有一個(gè)調(diào)度器scheduler專(zhuān)門(mén)給對(duì)應(yīng)的FSM分配事件,每個(gè)狀態(tài)機(jī)對(duì)應(yīng)邏輯處理流程中的一個(gè)狀態(tài),通過(guò)事件來(lái)觸發(fā)狀態(tài)機(jī)之間的切換,如圖2所示。在設(shè)計(jì)實(shí)現(xiàn)中,首先要從處理流程中將事件的各種狀態(tài)抽象出來(lái)(如輸入輸出完成、線程準(zhǔn)備就緒等狀態(tài)),構(gòu)成一系列FSM,然后實(shí)現(xiàn)scheduler和各個(gè)事件處理邏輯[6]。
圖2 事件驅(qū)動(dòng)模型
這種模型克服了線程池模型在高并發(fā)高負(fù)載環(huán)境下的不足,由一組線程循環(huán)處理相應(yīng)狀態(tài)的請(qǐng)求,處理完以后該線程又被放回到線程池中等待下一個(gè)處于相同狀態(tài)的請(qǐng)求。該模型的關(guān)鍵是設(shè)計(jì)一個(gè)高效公平的事件調(diào)度器,其中請(qǐng)求的優(yōu)先級(jí),事件的優(yōu)先級(jí),請(qǐng)求的資源消耗等都與具體的應(yīng)用相關(guān),不同的應(yīng)用需要不同的實(shí)現(xiàn)[7]。
1.3分階段的事件驅(qū)動(dòng)架構(gòu)模型
SEDA模型將模塊化思想運(yùn)用到了事件驅(qū)動(dòng)體系結(jié)構(gòu)中。該架構(gòu)將事件驅(qū)動(dòng)的處理流程分解成一系列的階段,每個(gè)階段完成一個(gè)獨(dú)立的功能。這些階段由事件隊(duì)列(Event Queue)連接起來(lái)并通過(guò)事件進(jìn)行通信,階段之間不共享數(shù)據(jù)。每個(gè)階段有自己的線程池(Thread Pool)、事件處理器(Event Handler)、事件隊(duì)列和資源控制器(Controllers),并且可以在運(yùn)行時(shí)通過(guò)資源控制器配置本階段的資源[8]。當(dāng)請(qǐng)求到來(lái)時(shí),系統(tǒng)依據(jù)請(qǐng)求內(nèi)容將其封裝成事件發(fā)送到相應(yīng)階段的事件隊(duì)列,該階段的工作線程按照控制器的控制策略從隊(duì)列中取出事件,調(diào)用事件處理器對(duì)事件進(jìn)行處理,處理完成后將結(jié)果封裝成事件按照請(qǐng)求的需要移交給下一個(gè)階段,直到完成整個(gè)請(qǐng)求的處理流程,如圖3所示。
圖3 分階段的事件驅(qū)動(dòng)模型
這種設(shè)計(jì)將邏輯應(yīng)用核心從線程管理和調(diào)度中分離出來(lái),為開(kāi)發(fā)者提供了統(tǒng)一的資源管理模型以降低應(yīng)用程序設(shè)計(jì)的復(fù)雜度,使開(kāi)發(fā)人員不用關(guān)心復(fù)雜的服務(wù)器資源控制。因?yàn)槊總€(gè)階段有獨(dú)立的運(yùn)行參數(shù),從而使得系統(tǒng)瓶頸很容易被定位[9]。目前多將該模型用于研究如何在極端負(fù)載情況下提升服務(wù)器性能。
在高負(fù)載的互聯(lián)網(wǎng)環(huán)境下,線程池模型有著明顯的不足,處理請(qǐng)求的工作流程中往往發(fā)生大量的阻塞,為了保證請(qǐng)求及時(shí)得到響應(yīng),必須增加線程數(shù)量。然而,系統(tǒng)的資源是有限的,線程之間上下文的切換也會(huì)帶來(lái)大量的處理器開(kāi)銷(xiāo)。因此,基于線程池模型的架構(gòu)在高并發(fā)、高負(fù)載的環(huán)境下性能會(huì)急劇下降,甚至造成系統(tǒng)癱瘓。
事件驅(qū)動(dòng)處理模型要求單個(gè)處理階段的阻塞時(shí)間不能太長(zhǎng),而且調(diào)度器決定了整個(gè)事件處理流程,結(jié)構(gòu)復(fù)雜,實(shí)現(xiàn)之后不能輕易改變,這使得應(yīng)用很難自定義流程,因此它的通用性不夠高。
SEDA模型結(jié)合了線程池模型和事件驅(qū)動(dòng)模型的優(yōu)點(diǎn),采用非阻塞輸入輸出,既充分利用了處理器的并行處理特點(diǎn)又避開(kāi)了線程切換的開(kāi)銷(xiāo)[10],并且能夠依照業(yè)務(wù)邏輯靈活地將服務(wù)劃分階段,在階段內(nèi)部進(jìn)行動(dòng)態(tài)資源調(diào)節(jié),再通過(guò)事件隊(duì)列將這些階段連接起來(lái)實(shí)現(xiàn)整個(gè)業(yè)務(wù)的處理流程,從而可以支持高并發(fā)、高負(fù)載,并且具有良好的通用性。
經(jīng)過(guò)比較與分析,SEDA架構(gòu)能使服務(wù)器有效應(yīng)對(duì)高并發(fā)高負(fù)載環(huán)境,并且能最好地滿足民航業(yè)務(wù)對(duì)服務(wù)器性能的各種要求。
2JCF平臺(tái)中的SEDA架構(gòu)
2.1整體結(jié)構(gòu)
JCF(Java Core Framework)中間件平臺(tái)是民航旅客服務(wù)信息系統(tǒng)的重要組成部分,允許使用Java語(yǔ)言以及相關(guān)技術(shù)實(shí)現(xiàn)交易處理。它的主要目的是提供一個(gè)使用Java技術(shù)創(chuàng)建、部署、運(yùn)行業(yè)務(wù)服務(wù)的平臺(tái)。平臺(tái)允許用戶(hù)使用Java語(yǔ)言創(chuàng)建核心的業(yè)務(wù)處理邏輯,并支持圖形化的流程配置模式將多個(gè)核心業(yè)務(wù)處理邏輯編排成為可獨(dú)立運(yùn)行、部署的業(yè)務(wù)服務(wù)。同時(shí)JCF平臺(tái)需要在內(nèi)部提供系統(tǒng)的方案來(lái)解決JCF平臺(tái)內(nèi)部業(yè)務(wù)服務(wù)與現(xiàn)有企業(yè)服務(wù)總線TSI(Travelsky Service Integrator)系統(tǒng)對(duì)接的問(wèn)題,以及通過(guò)TSI訪問(wèn)JCF平臺(tái)內(nèi)部業(yè)務(wù)服務(wù)時(shí),所需要的負(fù)載均衡、資源隔離、故障隔離等需求。
TSI為多個(gè)應(yīng)用之間的彼此訪問(wèn)提供消息路由通道。不同系統(tǒng)之間的應(yīng)用通過(guò)TS進(jìn)行交互時(shí),通過(guò)TSI的接入點(diǎn)接收發(fā)送給本系統(tǒng)應(yīng)用的消息,以及發(fā)出要發(fā)送到其他系統(tǒng)的消息。TSI負(fù)責(zé)將消息在不同系統(tǒng)的接入點(diǎn)之間進(jìn)行路由轉(zhuǎn)發(fā)。
JCF平臺(tái)由開(kāi)發(fā)工具、運(yùn)行系統(tǒng)、部署管理工具三大部分組成,為業(yè)務(wù)服務(wù)的開(kāi)發(fā)、部署、運(yùn)行和維護(hù)提供完整的支持。平臺(tái)的邏輯視圖如圖4所示。
圖4 JCF平臺(tái)結(jié)構(gòu)
JCF運(yùn)行系統(tǒng)的功能可以分為兩個(gè)層次,如圖5所示。
圖5 JCF運(yùn)行系統(tǒng)結(jié)構(gòu)
上層為服務(wù)層。作為應(yīng)用支撐框架,它允許用戶(hù)使用 Java 語(yǔ)言創(chuàng)建核心的業(yè)務(wù)處理邏輯,并將其編排成為可獨(dú)立運(yùn)行,部署的業(yè)務(wù)服務(wù),以一個(gè)服務(wù)為一個(gè)階段,階段之間用事件進(jìn)行通信。一個(gè)應(yīng)用可以包含多個(gè)服務(wù),當(dāng)應(yīng)用請(qǐng)求到來(lái)時(shí)會(huì)被交給多個(gè)服務(wù)依次序進(jìn)行處理,也就是對(duì)請(qǐng)求分階段處理。同樣也通過(guò)適配服務(wù)的方式解決JCF平臺(tái)內(nèi)部業(yè)務(wù)服務(wù)與現(xiàn)有TSI系統(tǒng)對(duì)接的問(wèn)題,當(dāng)外系統(tǒng)消息到來(lái)時(shí),首先由適配階段處理,然后將結(jié)果封裝成事件發(fā)送到下一個(gè)階段的事件隊(duì)列等待具體的業(yè)務(wù)處理。
底層為調(diào)用層。作為分布式服務(wù)調(diào)用平臺(tái),它為服務(wù)之間的相互調(diào)用提供基本支撐:SEDA異步調(diào)用、負(fù)載均衡、故障隔離、自動(dòng)尋址等等。對(duì)業(yè)務(wù)應(yīng)用的開(kāi)發(fā)人員來(lái)說(shuō)它是“透明”的。
2.2階段內(nèi)部結(jié)構(gòu)
按照SEDA模型對(duì)服務(wù)劃分階段的思想,將一個(gè)業(yè)務(wù)拆分成多個(gè)子服務(wù),以一個(gè)服務(wù)為一個(gè)階段。對(duì)于每個(gè)階段,它主要由以下三部分構(gòu)成:
1) 事件隊(duì)列。每個(gè)階段有自己的事件隊(duì)列,新到達(dá)的事件首先進(jìn)入該隊(duì)列,等待事件處理器進(jìn)行處理。該隊(duì)列的大小是有限制的,如果隊(duì)列達(dá)到閾值,新到的事件會(huì)被轉(zhuǎn)發(fā)到特定的錯(cuò)誤處理階段。
2) 線程池。線程池為本階段的并發(fā)處理提供工作線程,它對(duì)應(yīng)用程序來(lái)說(shuō)是透明的,階段與階段之間的線程池互相獨(dú)立。根據(jù)各自階段負(fù)載情況的不同,各個(gè)階段可以動(dòng)態(tài)地調(diào)整本階段線程池的大小,避免某個(gè)階段用完所有的線程資源。
3) 事件處理器。事件處理器是業(yè)務(wù)邏輯的核心,它從事件隊(duì)列中取出事件,執(zhí)行用戶(hù)定義的邏輯操作,然后將事件發(fā)送給下一個(gè)階段。事件處理器通常由用戶(hù)自己編寫(xiě),具有良好的靈活性。
此外用資源控制器根據(jù)各個(gè)階段的運(yùn)行時(shí)負(fù)載狀況調(diào)節(jié)本階段的資源配置和運(yùn)行參數(shù),其主要組成部件為線程池控制器和批處理控制器。線程池控制器用來(lái)控制運(yùn)行時(shí)的線程池大小,當(dāng)本階段事件隊(duì)列的深度比較大的時(shí)候,說(shuō)明該階段有比較高的負(fù)載,則增加線程數(shù),反之則銷(xiāo)毀一些線程。批處理控制器用來(lái)控制事件處理器處理事件的并發(fā)量,也就是控制每次從事件隊(duì)列中取出的事件的數(shù)量。通過(guò)在每一批事件當(dāng)中共享代碼和數(shù)據(jù),提高服務(wù)器緩存命中率,從而提高JCF平臺(tái)的吞吐量。
當(dāng)外系統(tǒng)產(chǎn)生一個(gè)JCF業(yè)務(wù)請(qǐng)求時(shí),首先將請(qǐng)求發(fā)送至TSI,由TSI將消息路由至JCF接入點(diǎn)。然后由JCF平臺(tái)中的適配服務(wù)從接入點(diǎn)獲取請(qǐng)求消息并進(jìn)行適配階段的處理,處理完成后將消息封裝成為事件,依據(jù)請(qǐng)求的需要發(fā)送到業(yè)務(wù)處理階段的事件隊(duì)列等待處理。業(yè)務(wù)處理階段根據(jù)批處理控制器的策略從事件隊(duì)列中取出一批事件放到線程池中,交給用戶(hù)編寫(xiě)的事件處理器以并發(fā)的方式進(jìn)行處理。在這一過(guò)程執(zhí)行的同時(shí)事件隊(duì)列還會(huì)不停地接收到新的事件,線程池控制器會(huì)根據(jù)隊(duì)列深度的變化情況實(shí)時(shí)調(diào)整線程池大小,以合理分配系統(tǒng)資源。
在請(qǐng)求處理過(guò)程中如果出現(xiàn)服務(wù)之間的相互調(diào)用,由JCF平臺(tái)負(fù)責(zé)流程中的異步回調(diào)過(guò)程。JCF 平臺(tái)提供基于內(nèi)存隊(duì)列的SEDA異步機(jī)制,實(shí)現(xiàn)服務(wù)運(yùn)行和調(diào)用所需的異步模型: 異步觸發(fā)對(duì)服務(wù)的調(diào)用,調(diào)用后不會(huì)阻塞調(diào)用方線程的執(zhí)行。來(lái)不及處理的消息會(huì)臨時(shí)緩存在與服務(wù)綁定的內(nèi)存隊(duì)列中。JCF平臺(tái)通過(guò)這種方式解決了Java系統(tǒng)開(kāi)發(fā)中的線程同步阻塞問(wèn)題,使得系統(tǒng)不必掛起等待被調(diào)用服務(wù)的應(yīng)答,這在業(yè)務(wù)邏輯比較復(fù)雜的情況下能夠有效提高系統(tǒng)效率。
2.3服務(wù)異步調(diào)用過(guò)程
國(guó)際民航系統(tǒng)間報(bào)文交互基于IATA所定義的國(guó)際規(guī)范,該規(guī)范分TYPE-A和TYPE-B兩種類(lèi)型,其中TYPE-A屬于Request-Response模式,TYPE-B屬于One-way模式。JCF平臺(tái)提供了基于這兩種模式的異步調(diào)用過(guò)程。
JCF 平臺(tái)中的SEDA異步機(jī)制以非阻塞方式調(diào)用目標(biāo)服務(wù)。圖6顯示了服務(wù)異步調(diào)用的過(guò)程。
1) 源服務(wù)向服務(wù)平臺(tái)API發(fā)出服務(wù)調(diào)用請(qǐng)求。
2) 平臺(tái)負(fù)責(zé)將單個(gè)交易的交易序號(hào)存入應(yīng)答等待緩沖區(qū)。
3) 平臺(tái)將請(qǐng)求消息發(fā)送至JCFserver的發(fā)送隊(duì)列。
4) 當(dāng)被調(diào)用的服務(wù)實(shí)例位于其他的JCF服務(wù)器,由JCF服務(wù)器負(fù)責(zé)查找目標(biāo)服務(wù)所在主機(jī)。如果有多臺(tái)主機(jī)提供同樣的目標(biāo)服務(wù),則需要執(zhí)行負(fù)載均衡算法選擇一臺(tái)主機(jī),然后與目標(biāo)主機(jī)進(jìn)行通信,將消息發(fā)送至目標(biāo)主機(jī)的接收隊(duì)列。當(dāng)被調(diào)用的服務(wù)實(shí)例位于當(dāng)前的JCF服務(wù)器,優(yōu)先調(diào)用本地服務(wù),此時(shí)不進(jìn)行負(fù)載均衡調(diào)度。對(duì)本地服務(wù)調(diào)用時(shí),消息仍然使用隊(duì)列進(jìn)行轉(zhuǎn)發(fā),隊(duì)列的使用模式與異地消息收發(fā)的模式一致,主要區(qū)別在于不進(jìn)行通信轉(zhuǎn)發(fā)消息,而是直接投遞到目標(biāo)隊(duì)列。
5) 平臺(tái)通過(guò)異步方式接收到應(yīng)答后,自動(dòng)觸發(fā)回調(diào)接口進(jìn)行應(yīng)答的處理并且允許通過(guò)交易序號(hào)來(lái)識(shí)別請(qǐng)求與應(yīng)答之間的對(duì)應(yīng)關(guān)系。
6) 當(dāng)請(qǐng)求與應(yīng)答的交易序號(hào)相同時(shí),平臺(tái)會(huì)從應(yīng)答等待緩沖區(qū)中取出該交易的交易序號(hào)并將其從緩沖區(qū)中刪除。
7) 平臺(tái)根據(jù)該交易序號(hào)恢復(fù)現(xiàn)場(chǎng)并進(jìn)行后續(xù)處理,最后向發(fā)出該請(qǐng)求的服務(wù)提供交易序號(hào)并通知其調(diào)用已完成。
圖6 服務(wù)異步調(diào)用流程
服務(wù)平臺(tái)API還有定時(shí)功能。如果某個(gè)交易在超過(guò)一定時(shí)間后仍然沒(méi)有應(yīng)答消息,則服務(wù)平臺(tái)會(huì)從應(yīng)答等待緩沖區(qū)中將這個(gè)交易序號(hào)的流程運(yùn)行狀態(tài)刪除,并且通知發(fā)出該調(diào)用請(qǐng)求的服務(wù)交易超時(shí)。之后如果接收到了該交易的應(yīng)答消息則直接丟棄。
3實(shí)驗(yàn)
本節(jié)結(jié)合民航離港業(yè)務(wù)的處理過(guò)程給出了基于SEDA模型的異步模式服務(wù)器和基于線程池模型的同步模式服務(wù)器的性能對(duì)比實(shí)驗(yàn)結(jié)果。如圖7所示。
圖7 實(shí)驗(yàn)場(chǎng)景
民航離港業(yè)務(wù)是民航系統(tǒng)中最重要的業(yè)務(wù)之一,其處理速度直接影響到一個(gè)機(jī)場(chǎng)每天的旅客吞吐量。系統(tǒng)一旦故障,后果不堪設(shè)想。每個(gè)旅客值機(jī)的過(guò)程就是與離港系統(tǒng)做信息交互的過(guò)程。加快該過(guò)程能有效提高前臺(tái)工作人員的工作效率。
值機(jī)過(guò)程分提取電子客票、接收旅客兩個(gè)過(guò)程,其中接收旅客過(guò)程又由如下幾個(gè)子過(guò)程組成:電子客票驗(yàn)證、判斷是否為天合優(yōu)享旅客、分配座位、打印登機(jī)牌等幾個(gè)過(guò)程。傳統(tǒng)模式下的處理將這幾個(gè)過(guò)程放在同一個(gè)線程中順序處理。而轉(zhuǎn)移到JCF系統(tǒng)后,基于SEDA異步機(jī)制進(jìn)行處理。
本實(shí)驗(yàn)以中國(guó)民航離港業(yè)務(wù)的處理場(chǎng)景為模型組織。假設(shè)系統(tǒng)中存在A、B、C、D四個(gè)組件分別處理電子客票驗(yàn)證、判斷是否為天合優(yōu)享旅客、分配座位、打印登機(jī)牌4個(gè)過(guò)程,其中A、C、D的處理過(guò)程比較短暫,而B(niǎo)的執(zhí)行會(huì)牽涉到數(shù)據(jù)庫(kù)查詢(xún)或等待其他服務(wù)返回結(jié)果等導(dǎo)致的長(zhǎng)時(shí)間阻塞?,F(xiàn)在假設(shè)有兩個(gè)請(qǐng)求,請(qǐng)求1的處理過(guò)程需要用到A、C和D組件,請(qǐng)求2的處理過(guò)程需要用到B和C組件,用來(lái)模擬復(fù)雜民航業(yè)務(wù)。假設(shè)請(qǐng)求1的處理過(guò)程中處理器使用時(shí)間T1是0.1 ms,阻塞時(shí)間T2是3 ms。 請(qǐng)求2的處理過(guò)程中處理器使用時(shí)間T1是0.1 ms,而數(shù)據(jù)庫(kù)查詢(xún)和等待其他服務(wù)返回結(jié)果導(dǎo)致的阻塞時(shí)間T2是300 ms。
在傳統(tǒng)線程池的方案中,為了在阻塞時(shí)間T2中提供充足的線程使處理器保持忙碌的狀態(tài)以充分利用處理器,需要設(shè)置大約 N×(1+T2/T1) 個(gè)線程。其中N是系統(tǒng)擁有的處理器數(shù)量。通過(guò)前面的假設(shè)數(shù)據(jù)計(jì)算后可知,請(qǐng)求1需要30個(gè)線程,請(qǐng)求2需要3000個(gè)線程。
在線程池方案中,同時(shí)向服務(wù)器大量發(fā)送請(qǐng)求1、請(qǐng)求2,兩種請(qǐng)求的數(shù)量大致相同,則線程池會(huì)將線程資源平均分配給兩種請(qǐng)求。假設(shè)線程池的大小是請(qǐng)求1與請(qǐng)求2的數(shù)量之和3030,按照線程池模型的分配策略,3030個(gè)線程會(huì)被平均分配給請(qǐng)求1和請(qǐng)求2。這樣導(dǎo)致的結(jié)果是:請(qǐng)求1被分配了過(guò)量的線程,多余的線程得不到利用卻增加了線程調(diào)度的開(kāi)銷(xiāo);請(qǐng)求2得到的線程數(shù)量不足,當(dāng)線程全部阻塞時(shí)處理器處于空閑狀態(tài)卻沒(méi)有充足的線程用來(lái)處理新到達(dá)的事件,系統(tǒng)吞吐量下降。
而SEDA架構(gòu)的服務(wù)器的不同之處在于它能夠根據(jù)請(qǐng)求的不同執(zhí)行情況為它們分配適當(dāng)數(shù)量的線程。一個(gè)請(qǐng)求會(huì)由多個(gè)組件進(jìn)行處理,每個(gè)組件對(duì)應(yīng)SEDA中的一個(gè)階段,在本例中就分為A、B、C、D四個(gè)階段。雖然每個(gè)階段的資源需求和執(zhí)行情況都不同,但是SEDA的資源控制器可以為每個(gè)階段動(dòng)態(tài)調(diào)整資源數(shù)量,比如當(dāng)某個(gè)階段的線程池中的線程大量阻塞的時(shí)候,就多給該階段多分配些線程,反之則減少些線程,這樣就達(dá)到了為不同請(qǐng)求分配不同數(shù)量的線程的目的。組件之間的調(diào)用方式也由同步調(diào)用改造為基于事件驅(qū)動(dòng)的異步調(diào)用方式,以減少處理復(fù)雜業(yè)務(wù)時(shí)處理器空閑等待的時(shí)間。
針對(duì)這樣的場(chǎng)景設(shè)計(jì)了普通Java程序和JCF應(yīng)用程序,并分別運(yùn)行在JVM和JCF平臺(tái)上。
實(shí)驗(yàn)環(huán)境: HP Pro 3000 MT Business PC,機(jī)器的配置如下:
1) Intel Core2 Quad CPU Q9500 @ 2.83 GHz 2.83 GHz
2) 4 GB RAM
3) Windows 7 Pro
4) SUN JDK Version 1.8.0_20
5) JCF1.2
在服務(wù)器上部署好JCF平臺(tái),然后安裝上待測(cè)試的服務(wù)。根據(jù)機(jī)器的配置情況,將并發(fā)量變化區(qū)間定為300 ~40 000。按照并發(fā)數(shù)的大小順序依次執(zhí)行, 每次實(shí)驗(yàn)執(zhí)行 3 遍,防止隨機(jī)誤差。根據(jù)結(jié)果得到如圖8所示。
圖8 實(shí)驗(yàn)結(jié)果對(duì)比
圖8顯示了服務(wù)器的單位時(shí)間吞吐量。在系統(tǒng)并發(fā)數(shù)較少的時(shí)候,差別幾乎看不出來(lái)。但是在并發(fā)數(shù)逐漸增大時(shí),基于SEDA模型的服務(wù)器吞吐量呈穩(wěn)步上升的趨勢(shì),而傳統(tǒng)的基于線程池模型的服務(wù)器的吞吐量則顯得不夠穩(wěn)定?;赟EDA模型的服務(wù)器顯示出了更為良好并且穩(wěn)定的性能。這說(shuō)明SEDA架構(gòu)的確成功提高了系統(tǒng)應(yīng)對(duì)高并發(fā)高負(fù)載網(wǎng)絡(luò)環(huán)境的能力,并且在處理民航復(fù)雜業(yè)務(wù)的情況下基于SEDA模型的異步模式服務(wù)器在性能方面要優(yōu)于同步模式的服務(wù)器。
4結(jié)語(yǔ)
本文針對(duì)民航旅客服務(wù)信息系統(tǒng)實(shí)時(shí)并發(fā)請(qǐng)求多、業(yè)務(wù)功能復(fù)雜多變、數(shù)據(jù)量大等業(yè)務(wù)特點(diǎn),引入了將服務(wù)劃分階段的方法,研究了如何在大規(guī)模民航旅客服務(wù)信息系統(tǒng)中應(yīng)用分階段的事件驅(qū)動(dòng)架構(gòu)模型。通過(guò)將SEDA模型引入JCF平臺(tái),實(shí)現(xiàn)了在運(yùn)行時(shí)將同步流程自動(dòng)轉(zhuǎn)換為異步方式執(zhí)行的特性,完全解決了Java系統(tǒng)開(kāi)發(fā)中的線程同步阻塞問(wèn)題,使得用戶(hù)不必關(guān)心同異步的轉(zhuǎn)換,從而能夠?qū)W⒂诔绦驑I(yè)務(wù)邏輯的開(kāi)發(fā)。同時(shí)用實(shí)驗(yàn)驗(yàn)證表明SEDA架構(gòu)使得該平臺(tái)能夠通過(guò)運(yùn)行時(shí)動(dòng)態(tài)調(diào)節(jié)資源配置獲得穩(wěn)定的服務(wù)器性能,極大地提高了服務(wù)器應(yīng)對(duì)高并發(fā)高負(fù)載環(huán)境的能力,進(jìn)而增強(qiáng)了民航旅客服務(wù)信息系統(tǒng)的處理能力,使得該系統(tǒng)能夠快速適應(yīng)復(fù)雜多變的用戶(hù)需求和業(yè)務(wù)環(huán)境,降低軟件開(kāi)發(fā)和維護(hù)成本,提高企業(yè)信息化水平。
參考文獻(xiàn)
[1] 唐國(guó)鐘.基于SEDA的自適應(yīng)性能優(yōu)化技術(shù)[D].電子科技大學(xué),2008.
[2] 劉新強(qiáng),曾兵義.用線程池解決服務(wù)器并發(fā)請(qǐng)求的方案設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2011,34(15):141-143.
[3] 姚錫凡,金鴻,李彬,等.事件驅(qū)動(dòng)的面向云制造服務(wù)架構(gòu)及其開(kāi)源實(shí)現(xiàn)[J].計(jì)算機(jī)集成制造系統(tǒng),2013,19(3):654-661.
[4] 馬存,馬躍,廉東本,等.基于SEDA企業(yè)服務(wù)總線負(fù)載控制[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2013,22(12):66-69.
[5] 趙金柱.基于事件驅(qū)動(dòng)的SOA結(jié)構(gòu)設(shè)計(jì)與研究[D].華北電力大學(xué),2012.
[6] 彭樂(lè),趙新陽(yáng),黃靚,等.基于分階段事件驅(qū)動(dòng)的企業(yè)服務(wù)總線設(shè)計(jì)與實(shí)現(xiàn)[J].信息技術(shù)與標(biāo)準(zhǔn)化,2011,53(5):73-77.
[7] Shi Jianhong,Zhang Shengli,Chang Zhenggang.The security analysis of a threshold proxy quantum signature scheme[J].Science China(Physics,Mechanics & Astronomy),2013,56(3):519-523.
[8] 董率,廉東本,劉鵬.基于SEDA的企業(yè)服務(wù)總線的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2010,19(9):44-48.
[9] 羅海南.多階段事件驅(qū)動(dòng)架構(gòu)性能調(diào)優(yōu)機(jī)制的研究[D].電子科技大學(xué),2009.
[10] 魯先志.基于SEDA的服務(wù)器端應(yīng)用程序設(shè)計(jì)與實(shí)現(xiàn)[D].重慶大學(xué),2008.
DESIGNING SERVER ARCHITECTURE FOR COMPLICATED AND HIGH CONCURRENCY CIVIL AVIATION BUSINESSES
Li Yongjin1Tian Feng1Ni Zhaoyang2
1(ResearchandDevelopmentCenter,TravelSkyTechnologyLimited,Beijing100000,China)2(SchoolofComputerScienceandTechnology,CivilAviationUniversityofChina,Tianjin300000,China)
AbstractFor the operation features of civil aviation business such as numerous real-time concurrent requests, complicated and changeable operation functions, large amount data, high reliability, etc., we analysed the advantages and disadvantages of currently prevalent server architectures. We divided the service into stages and introduced the staged event-driven architecture (SEDA) into civil aviation passengers service information system (CAPSIS), and carried out an experiment for comparative verification. It is proved by the experimental result that the server software architecture applying SEDA has better capacity than those thread pool model-based architectures in dealing with high concurrent requests, which can make large-scale CAPSIS respond effectively to high-concurrency and high-load environment.
KeywordsSEDAServer architectureMiddlewareCivil aviation passengers service information systemAsynchronous call
收稿日期:2014-12-25。國(guó)家科技支撐計(jì)劃項(xiàng)目(2014BAJ04B 02);民航局科技創(chuàng)新引導(dǎo)資金專(zhuān)項(xiàng)(MHRD20130106);中國(guó)民航大學(xué)中央高?;痦?xiàng)目(3122014P004,3122014C016)。李永進(jìn),工程師,主研領(lǐng)域:中間件及分布式系統(tǒng)架構(gòu)。田豐,工程師。倪兆陽(yáng),碩士生。
中圖分類(lèi)號(hào)TP319
文獻(xiàn)標(biāo)識(shí)碼A
DOI:10.3969/j.issn.1000-386x.2016.05.002