APP下载

面向高并发复杂民航业务的服务器架构设计

2016-06-08李永进倪兆阳

计算机应用与软件 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的执行会牵涉到数据库查询或等待其他服务返回结果等导致的长时间阻塞。现在假设有两个请求,请求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模型的服务器吞吐量呈稳步上升的趋势,而传统的基于线程池模型的服务器的吞吐量则显得不够稳定。基于SEDA模型的服务器显示出了更为良好并且稳定的性能。这说明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的多线程技术探讨