?

面向高并發復雜民航業務的服務器架構設計

2016-06-08 05:48李永進倪兆陽
計算機應用與軟件 2016年5期
關鍵詞:調用線程處理器

李永進 田 豐 倪兆陽

1(中國民航信息網絡股份有限公司研發中心 北京 100000)2(中國民航大學計算機科學與技術學院 天津 300000)

?

面向高并發復雜民航業務的服務器架構設計

李永進1田豐1倪兆陽2

1(中國民航信息網絡股份有限公司研發中心北京 100000)2(中國民航大學計算機科學與技術學院天津 300000)

摘要針對民航業務實時并發請求多、業務功能復雜多變、數據量大、可靠性要求高等業務特點,分析當前流行的服務器架構的優缺點,將服務劃分階段,在民航旅客服務信息系統中引入分階段的事件驅動架構SEDA(Staged Event-Driven Architecture),并進行實驗對比驗證。實驗結果表明,基于SEDA的服務器軟件架構比基于線程池模型的服務器軟件架構擁有更好的處理高并發請求的能力,能夠使大規模民航旅客服務信息系統有效應對高并發高負載環境。

關鍵詞SEDA服務器架構中間件民航旅客服務信息系統異步調用

0引言

隨著經濟社會的發展,互聯網變得觸手可及,網絡上的流量也增加了許多倍,這對于提供各種服務的服務器是一個不小的挑戰,未來網絡服務器的任務將更加繁重。雖然隨著時間的推移計算機硬件在不斷發展,服務器的性能有了很大提升,但仍然難以滿足大量的并發訪問對性能的要求。同時,全球各地的用戶經常以碎片化、互相近似的形式向服務器發出請求, 用戶請求在高峰時段會超過平均值的8到10倍[1],服務器的處理能力通常不能承受這樣的負載,以至于其響應時間將會大大增加,吞吐量嚴重降低,更有甚者還會停止服務,提供給用戶的服務質量很難得到保證。

互聯網及航空業的不斷發展使得越來越多的人選擇從互聯網獲得關于航班的各種信息。民航業自身的發展也要求其信息化程度逐步提高,這意味著越來越多的民航業務要由信息系統處理。

民航旅客服務信息系統對可靠性要求極高,信息系統的運行狀況不僅僅關系到提供給地面用戶的服務質量,還涉及到空中的交通安全和全國各航空公司的飛行計劃安排,一旦出現差錯將造成大量的旅客滯留和航班延誤,其損失是不可估量的。

民航旅客服務系統需要面向全國用戶,請求數量龐大,而且民航業務復雜,一個民航業務請求往往需要多個服務協同工作才能完成,這對民航旅客服務信息系統的處理能力提出了極大的挑戰。同時根據SOA的要求還需要提高民航軟件復用度,實現業務功能靈活定制。

這就要求民航旅客服務信息系統能夠良好地應對高并發高負載環境,通過服務整合機制實現應用間的消息通信,形成面向用戶的實際業務功能。提高現有服務器對高并發、動態變化、連續高可靠性的適應能力以及對其他需求的應對能力成為當前的重要任務。

除了計算機硬件性能以外,服務器的軟件架構也會對服務器性能產生重要影響。優秀的軟件架構能夠充分發揮出計算機的硬件性能,提高軟件的可重用性,降低軟件開發和維護成本,為企業帶來豐厚的經濟效益。因此有必要設計一款先進的軟件架構為企業的應用開發和服務復用提供基礎服務,使民航旅客服務信息系統支持高并發高負載復雜民航業務,支持軟件復用,滿足民航業務對系統通用性和靈活性的需求。

1研究現狀

目前的交易處理服務器軟件架構主要基于三種模型。第一種是線程池模型[2],為每個請求分配一個線程;第二種是事件驅動(Event-Driven)處理模型[3],由一個調度器控制消息的處理流程;第三種是SEDA模型[1,4],將處理流程劃分成不同的處理階段,階段之間用事件隊列連接。

1.1線程池模型

線程池模型充分體現了操作系統對多線程技術的支持,通過多線程實現處理器、輸入輸出資源的多路復用,從而實現高并發處理,也可以通過重用已經創建好的線程來降低新建和銷毀線程的開銷[5]。系統中由一個主線程dispatcher專門負責給線程池的其他線程分派任務,如圖1所示。每個線程完成它所處理的任務的所有業務邏輯,如執行查詢數據庫請求的所有邏輯步驟,然后再等待新的請求。該模型容易實現且應用廣泛,其處理邏輯以阻塞方式進行工作。在這種模型下,如果大量的線程因為等待某個事件的完成而被阻塞(比如等待磁盤IO、等待其他服務返回結果等),就會使其他新到的請求得不到及時處理。

圖1 線程池模型

1.2事件驅動處理模型

事件驅動處理模型將請求表示成一個有限狀態機FSM(Finite State Machine),根據請求的當前狀態進行相應的處理。系統中有一個調度器scheduler專門給對應的FSM分配事件,每個狀態機對應邏輯處理流程中的一個狀態,通過事件來觸發狀態機之間的切換,如圖2所示。在設計實現中,首先要從處理流程中將事件的各種狀態抽象出來(如輸入輸出完成、線程準備就緒等狀態),構成一系列FSM,然后實現scheduler和各個事件處理邏輯[6]。

圖2 事件驅動模型

這種模型克服了線程池模型在高并發高負載環境下的不足,由一組線程循環處理相應狀態的請求,處理完以后該線程又被放回到線程池中等待下一個處于相同狀態的請求。該模型的關鍵是設計一個高效公平的事件調度器,其中請求的優先級,事件的優先級,請求的資源消耗等都與具體的應用相關,不同的應用需要不同的實現[7]。

1.3分階段的事件驅動架構模型

SEDA模型將模塊化思想運用到了事件驅動體系結構中。該架構將事件驅動的處理流程分解成一系列的階段,每個階段完成一個獨立的功能。這些階段由事件隊列(Event Queue)連接起來并通過事件進行通信,階段之間不共享數據。每個階段有自己的線程池(Thread Pool)、事件處理器(Event Handler)、事件隊列和資源控制器(Controllers),并且可以在運行時通過資源控制器配置本階段的資源[8]。當請求到來時,系統依據請求內容將其封裝成事件發送到相應階段的事件隊列,該階段的工作線程按照控制器的控制策略從隊列中取出事件,調用事件處理器對事件進行處理,處理完成后將結果封裝成事件按照請求的需要移交給下一個階段,直到完成整個請求的處理流程,如圖3所示。

圖3 分階段的事件驅動模型

這種設計將邏輯應用核心從線程管理和調度中分離出來,為開發者提供了統一的資源管理模型以降低應用程序設計的復雜度,使開發人員不用關心復雜的服務器資源控制。因為每個階段有獨立的運行參數,從而使得系統瓶頸很容易被定位[9]。目前多將該模型用于研究如何在極端負載情況下提升服務器性能。

在高負載的互聯網環境下,線程池模型有著明顯的不足,處理請求的工作流程中往往發生大量的阻塞,為了保證請求及時得到響應,必須增加線程數量。然而,系統的資源是有限的,線程之間上下文的切換也會帶來大量的處理器開銷。因此,基于線程池模型的架構在高并發、高負載的環境下性能會急劇下降,甚至造成系統癱瘓。

事件驅動處理模型要求單個處理階段的阻塞時間不能太長,而且調度器決定了整個事件處理流程,結構復雜,實現之后不能輕易改變,這使得應用很難自定義流程,因此它的通用性不夠高。

SEDA模型結合了線程池模型和事件驅動模型的優點,采用非阻塞輸入輸出,既充分利用了處理器的并行處理特點又避開了線程切換的開銷[10],并且能夠依照業務邏輯靈活地將服務劃分階段,在階段內部進行動態資源調節,再通過事件隊列將這些階段連接起來實現整個業務的處理流程,從而可以支持高并發、高負載,并且具有良好的通用性。

經過比較與分析,SEDA架構能使服務器有效應對高并發高負載環境,并且能最好地滿足民航業務對服務器性能的各種要求。

2JCF平臺中的SEDA架構

2.1整體結構

JCF(Java Core Framework)中間件平臺是民航旅客服務信息系統的重要組成部分,允許使用Java語言以及相關技術實現交易處理。它的主要目的是提供一個使用Java技術創建、部署、運行業務服務的平臺。平臺允許用戶使用Java語言創建核心的業務處理邏輯,并支持圖形化的流程配置模式將多個核心業務處理邏輯編排成為可獨立運行、部署的業務服務。同時JCF平臺需要在內部提供系統的方案來解決JCF平臺內部業務服務與現有企業服務總線TSI(Travelsky Service Integrator)系統對接的問題,以及通過TSI訪問JCF平臺內部業務服務時,所需要的負載均衡、資源隔離、故障隔離等需求。

TSI為多個應用之間的彼此訪問提供消息路由通道。不同系統之間的應用通過TS進行交互時,通過TSI的接入點接收發送給本系統應用的消息,以及發出要發送到其他系統的消息。TSI負責將消息在不同系統的接入點之間進行路由轉發。

JCF平臺由開發工具、運行系統、部署管理工具三大部分組成,為業務服務的開發、部署、運行和維護提供完整的支持。平臺的邏輯視圖如圖4所示。

圖4 JCF平臺結構

JCF運行系統的功能可以分為兩個層次,如圖5所示。

圖5 JCF運行系統結構

上層為服務層。作為應用支撐框架,它允許用戶使用 Java 語言創建核心的業務處理邏輯,并將其編排成為可獨立運行,部署的業務服務,以一個服務為一個階段,階段之間用事件進行通信。一個應用可以包含多個服務,當應用請求到來時會被交給多個服務依次序進行處理,也就是對請求分階段處理。同樣也通過適配服務的方式解決JCF平臺內部業務服務與現有TSI系統對接的問題,當外系統消息到來時,首先由適配階段處理,然后將結果封裝成事件發送到下一個階段的事件隊列等待具體的業務處理。

底層為調用層。作為分布式服務調用平臺,它為服務之間的相互調用提供基本支撐:SEDA異步調用、負載均衡、故障隔離、自動尋址等等。對業務應用的開發人員來說它是“透明”的。

2.2階段內部結構

按照SEDA模型對服務劃分階段的思想,將一個業務拆分成多個子服務,以一個服務為一個階段。對于每個階段,它主要由以下三部分構成:

1) 事件隊列。每個階段有自己的事件隊列,新到達的事件首先進入該隊列,等待事件處理器進行處理。該隊列的大小是有限制的,如果隊列達到閾值,新到的事件會被轉發到特定的錯誤處理階段。

2) 線程池。線程池為本階段的并發處理提供工作線程,它對應用程序來說是透明的,階段與階段之間的線程池互相獨立。根據各自階段負載情況的不同,各個階段可以動態地調整本階段線程池的大小,避免某個階段用完所有的線程資源。

3) 事件處理器。事件處理器是業務邏輯的核心,它從事件隊列中取出事件,執行用戶定義的邏輯操作,然后將事件發送給下一個階段。事件處理器通常由用戶自己編寫,具有良好的靈活性。

此外用資源控制器根據各個階段的運行時負載狀況調節本階段的資源配置和運行參數,其主要組成部件為線程池控制器和批處理控制器。線程池控制器用來控制運行時的線程池大小,當本階段事件隊列的深度比較大的時候,說明該階段有比較高的負載,則增加線程數,反之則銷毀一些線程。批處理控制器用來控制事件處理器處理事件的并發量,也就是控制每次從事件隊列中取出的事件的數量。通過在每一批事件當中共享代碼和數據,提高服務器緩存命中率,從而提高JCF平臺的吞吐量。

當外系統產生一個JCF業務請求時,首先將請求發送至TSI,由TSI將消息路由至JCF接入點。然后由JCF平臺中的適配服務從接入點獲取請求消息并進行適配階段的處理,處理完成后將消息封裝成為事件,依據請求的需要發送到業務處理階段的事件隊列等待處理。業務處理階段根據批處理控制器的策略從事件隊列中取出一批事件放到線程池中,交給用戶編寫的事件處理器以并發的方式進行處理。在這一過程執行的同時事件隊列還會不停地接收到新的事件,線程池控制器會根據隊列深度的變化情況實時調整線程池大小,以合理分配系統資源。

在請求處理過程中如果出現服務之間的相互調用,由JCF平臺負責流程中的異步回調過程。JCF 平臺提供基于內存隊列的SEDA異步機制,實現服務運行和調用所需的異步模型: 異步觸發對服務的調用,調用后不會阻塞調用方線程的執行。來不及處理的消息會臨時緩存在與服務綁定的內存隊列中。JCF平臺通過這種方式解決了Java系統開發中的線程同步阻塞問題,使得系統不必掛起等待被調用服務的應答,這在業務邏輯比較復雜的情況下能夠有效提高系統效率。

2.3服務異步調用過程

國際民航系統間報文交互基于IATA所定義的國際規范,該規范分TYPE-A和TYPE-B兩種類型,其中TYPE-A屬于Request-Response模式,TYPE-B屬于One-way模式。JCF平臺提供了基于這兩種模式的異步調用過程。

JCF 平臺中的SEDA異步機制以非阻塞方式調用目標服務。圖6顯示了服務異步調用的過程。

1) 源服務向服務平臺API發出服務調用請求。

2) 平臺負責將單個交易的交易序號存入應答等待緩沖區。

3) 平臺將請求消息發送至JCFserver的發送隊列。

4) 當被調用的服務實例位于其他的JCF服務器,由JCF服務器負責查找目標服務所在主機。如果有多臺主機提供同樣的目標服務,則需要執行負載均衡算法選擇一臺主機,然后與目標主機進行通信,將消息發送至目標主機的接收隊列。當被調用的服務實例位于當前的JCF服務器,優先調用本地服務,此時不進行負載均衡調度。對本地服務調用時,消息仍然使用隊列進行轉發,隊列的使用模式與異地消息收發的模式一致,主要區別在于不進行通信轉發消息,而是直接投遞到目標隊列。

5) 平臺通過異步方式接收到應答后,自動觸發回調接口進行應答的處理并且允許通過交易序號來識別請求與應答之間的對應關系。

6) 當請求與應答的交易序號相同時,平臺會從應答等待緩沖區中取出該交易的交易序號并將其從緩沖區中刪除。

7) 平臺根據該交易序號恢復現場并進行后續處理,最后向發出該請求的服務提供交易序號并通知其調用已完成。

圖6 服務異步調用流程

服務平臺API還有定時功能。如果某個交易在超過一定時間后仍然沒有應答消息,則服務平臺會從應答等待緩沖區中將這個交易序號的流程運行狀態刪除,并且通知發出該調用請求的服務交易超時。之后如果接收到了該交易的應答消息則直接丟棄。

3實驗

本節結合民航離港業務的處理過程給出了基于SEDA模型的異步模式服務器和基于線程池模型的同步模式服務器的性能對比實驗結果。如圖7所示。

圖7 實驗場景

民航離港業務是民航系統中最重要的業務之一,其處理速度直接影響到一個機場每天的旅客吞吐量。系統一旦故障,后果不堪設想。每個旅客值機的過程就是與離港系統做信息交互的過程。加快該過程能有效提高前臺工作人員的工作效率。

值機過程分提取電子客票、接收旅客兩個過程,其中接收旅客過程又由如下幾個子過程組成:電子客票驗證、判斷是否為天合優享旅客、分配座位、打印登機牌等幾個過程。傳統模式下的處理將這幾個過程放在同一個線程中順序處理。而轉移到JCF系統后,基于SEDA異步機制進行處理。

本實驗以中國民航離港業務的處理場景為模型組織。假設系統中存在A、B、C、D四個組件分別處理電子客票驗證、判斷是否為天合優享旅客、分配座位、打印登機牌4個過程,其中A、C、D的處理過程比較短暫,而B的執行會牽涉到數據庫查詢或等待其他服務返回結果等導致的長時間阻塞?,F在假設有兩個請求,請求1的處理過程需要用到A、C和D組件,請求2的處理過程需要用到B和C組件,用來模擬復雜民航業務。假設請求1的處理過程中處理器使用時間T1是0.1 ms,阻塞時間T2是3 ms。 請求2的處理過程中處理器使用時間T1是0.1 ms,而數據庫查詢和等待其他服務返回結果導致的阻塞時間T2是300 ms。

在傳統線程池的方案中,為了在阻塞時間T2中提供充足的線程使處理器保持忙碌的狀態以充分利用處理器,需要設置大約 N×(1+T2/T1) 個線程。其中N是系統擁有的處理器數量。通過前面的假設數據計算后可知,請求1需要30個線程,請求2需要3000個線程。

在線程池方案中,同時向服務器大量發送請求1、請求2,兩種請求的數量大致相同,則線程池會將線程資源平均分配給兩種請求。假設線程池的大小是請求1與請求2的數量之和3030,按照線程池模型的分配策略,3030個線程會被平均分配給請求1和請求2。這樣導致的結果是:請求1被分配了過量的線程,多余的線程得不到利用卻增加了線程調度的開銷;請求2得到的線程數量不足,當線程全部阻塞時處理器處于空閑狀態卻沒有充足的線程用來處理新到達的事件,系統吞吐量下降。

而SEDA架構的服務器的不同之處在于它能夠根據請求的不同執行情況為它們分配適當數量的線程。一個請求會由多個組件進行處理,每個組件對應SEDA中的一個階段,在本例中就分為A、B、C、D四個階段。雖然每個階段的資源需求和執行情況都不同,但是SEDA的資源控制器可以為每個階段動態調整資源數量,比如當某個階段的線程池中的線程大量阻塞的時候,就多給該階段多分配些線程,反之則減少些線程,這樣就達到了為不同請求分配不同數量的線程的目的。組件之間的調用方式也由同步調用改造為基于事件驅動的異步調用方式,以減少處理復雜業務時處理器空閑等待的時間。

針對這樣的場景設計了普通Java程序和JCF應用程序,并分別運行在JVM和JCF平臺上。

實驗環境: HP Pro 3000 MT Business PC,機器的配置如下:

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

在服務器上部署好JCF平臺,然后安裝上待測試的服務。根據機器的配置情況,將并發量變化區間定為300 ~40 000。按照并發數的大小順序依次執行, 每次實驗執行 3 遍,防止隨機誤差。根據結果得到如圖8所示。

圖8 實驗結果對比

圖8顯示了服務器的單位時間吞吐量。在系統并發數較少的時候,差別幾乎看不出來。但是在并發數逐漸增大時,基于SEDA模型的服務器吞吐量呈穩步上升的趨勢,而傳統的基于線程池模型的服務器的吞吐量則顯得不夠穩定?;赟EDA模型的服務器顯示出了更為良好并且穩定的性能。這說明SEDA架構的確成功提高了系統應對高并發高負載網絡環境的能力,并且在處理民航復雜業務的情況下基于SEDA模型的異步模式服務器在性能方面要優于同步模式的服務器。

4結語

本文針對民航旅客服務信息系統實時并發請求多、業務功能復雜多變、數據量大等業務特點,引入了將服務劃分階段的方法,研究了如何在大規模民航旅客服務信息系統中應用分階段的事件驅動架構模型。通過將SEDA模型引入JCF平臺,實現了在運行時將同步流程自動轉換為異步方式執行的特性,完全解決了Java系統開發中的線程同步阻塞問題,使得用戶不必關心同異步的轉換,從而能夠專注于程序業務邏輯的開發。同時用實驗驗證表明SEDA架構使得該平臺能夠通過運行時動態調節資源配置獲得穩定的服務器性能,極大地提高了服務器應對高并發高負載環境的能力,進而增強了民航旅客服務信息系統的處理能力,使得該系統能夠快速適應復雜多變的用戶需求和業務環境,降低軟件開發和維護成本,提高企業信息化水平。

參考文獻

[1] 唐國鐘.基于SEDA的自適應性能優化技術[D].電子科技大學,2008.

[2] 劉新強,曾兵義.用線程池解決服務器并發請求的方案設計[J].現代電子技術,2011,34(15):141-143.

[3] 姚錫凡,金鴻,李彬,等.事件驅動的面向云制造服務架構及其開源實現[J].計算機集成制造系統,2013,19(3):654-661.

[4] 馬存,馬躍,廉東本,等.基于SEDA企業服務總線負載控制[J].計算機系統應用,2013,22(12):66-69.

[5] 趙金柱.基于事件驅動的SOA結構設計與研究[D].華北電力大學,2012.

[6] 彭樂,趙新陽,黃靚,等.基于分階段事件驅動的企業服務總線設計與實現[J].信息技術與標準化,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的企業服務總線的設計與實現[J].計算機系統應用,2010,19(9):44-48.

[9] 羅海南.多階段事件驅動架構性能調優機制的研究[D].電子科技大學,2009.

[10] 魯先志.基于SEDA的服務器端應用程序設計與實現[D].重慶大學,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。國家科技支撐計劃項目(2014BAJ04B 02);民航局科技創新引導資金專項(MHRD20130106);中國民航大學中央高?;痦椖?3122014P004,3122014C016)。李永進,工程師,主研領域:中間件及分布式系統架構。田豐,工程師。倪兆陽,碩士生。

中圖分類號TP319

文獻標識碼A

DOI:10.3969/j.issn.1000-386x.2016.05.002

猜你喜歡
調用線程處理器
基于C#線程實驗探究
基于國產化環境的線程池模型研究與實現
核電項目物項調用管理的應用研究
LabWindows/CVI下基于ActiveX技術的Excel調用
淺談linux多線程協作
基于系統調用的惡意軟件檢測技術研究
Imagination的ClearCallTM VoIP應用現可支持Cavium的OCTEON? Ⅲ多核處理器
ADI推出新一代SigmaDSP處理器
利用RFC技術實現SAP系統接口通信
Java的多線程技術探討
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合