基于流水线结构的即时开通激活系统分析与设计

2019-08-26 01:35曹剑锋张伟
数字技术与应用 2019年5期
关键词:队列分布式

曹剑锋 张伟

摘要:传统的电信运营支撑系统在遇到系统性能问题,提升系统效率的时候,一般采用的是多并发机制来解决效能的不足:(1)扩展硬件配置;(2)增加硬件数量;(3)增加软件并发。通过多并发机制一定程度上可以提升系统的性能,但会导致硬件设备无限度的增加,不论从管理维护上还是经济效益上都是不允许的,与企业降本增效的前提也是相悖的。本研究主要是针对MBOSS中的综合激活系统为例,借助分布式架构解决集中式系统带来的问题,利用队列和缓存技术,提升应用的并行接入能力和计算能力,降低高并发对应用和数据的IO压力。根据设计的需要把庞大的系统模块拆分成多个子功能模块,把一个整体的功能模块或者事务划分成不同的子功能模块独立部署,异步通信,以达到提高系统效率的目的。

关键词:分布式;队列;缓存

中图分类号:TP311.13 文献标识码:A 文章编号:1007-9416(2019)05-0180-02

1 关键技术方案分析与设计

根据调研的情况,当前IT系统均部署在Weblogic中间件上,采用Oracle数据库,是典型的三层IOE架构,系统的扩展性取决于数据库的性能及Weblogic的扩展性。

为了解决传统三层IOE架构存在的问题,也是其典型的特点:软件系统庞大复杂,扩展节点资源浪费严重,系统变更难度大;硬件配置要求高,基本都是小型机,财务成本高;集中架构受限于IO能力,性能无法大幅提升。我们提出了具体的设计思路:(1)利用队列和缓存技术,提升应用的并行接入能力和计算能力,降低高并发时,对应用和数据的IO压力。(2)针对业务量高峰期,应用优先级、核心/非核心网元分离、队列水平扩展等方案,解决业务拥塞问题。最终提出流水式业务调度功能架构,实现系统高性能的处理方式:

(1)流程引擎与规则引擎紧密结合,使用自然的语言定义流程流向,灵活配置。(2)交互采用异步操作方式,提高系统响应速度。(3)引擎内部对频繁访问的热表,采用内存表的技术,固化到内存中,极大提高流程引擎的处理速度。(4)引擎内部引用缓存队列,缓存流程数据,提高系统性能。

2 业务队列调度方案设计

2.1 队列设计

系统基于内存数据库设计相应的队列机制。主要包括以下两方面:

(1)基于网元建立队列。针对不同的业务网元,需要建立不同的调度队列,简化了队列的设计复杂度,将网元任务隔离开,屏蔽了不同任务的互相影响。在调度模块处理时,可针对不同网元,部署多个模块,以水平扩展应对业务量的不断增长。(2)取模调度原则。应对关系型内存数据库时,对于接口表的处理,采用关键字段取模的方式,多个处理模块可扫描同一个接口表,互不影响。

2.2 多网元顺序控制

系统需要对接多个不同的网元,这就存在网元的执行依赖关系。系统以预配置的方式,针对不同业务场景,对网元的先后顺序进行相应编排,并将该映射关系缓存至内存中。缓存机制基于以下原则,首次接收业务请求时,将通过数据库查询依赖关系,并缓存至内存,后续处理相同业务时,则直接从缓存中获取配置信息,减少IO交互,提升处理效率。

2.3 队列优先级

队列处理机制提供两种方式,先进先出和优先级队列。针对某些特定場景的业务,需要提供较高优先级以获得更快速地处理。系统针对不同场景,设计轻量化的优先级队列,为不同网元提供不同队列通道,以简化队列需求场景,满足优先级施工要求。

2.4 消息拥塞处理机制

随着运营业务的不断发展,系统需承受倍数增长的用户请求,若保持当前软硬件水平,终会达到极限承受点,进而造成业务拥塞。因此,系统在设计期间,充分考虑了水平扩展功能,以支撑大并发量的交易访问。

基于分布式组件化设计,系统应用模块设计采用进程分布划小原则实现,每个模块进程实现支撑业务处理过程中的一环,避免集中式的模块处理,在运行计算过程中,由于操作系统或JVM的线程调度竞争机制限制了模块的计算能力,无法充分利用应用服务器的CPU、内存和IO资源。

2.5 核心/非核心网元分离

在实际业务中,部分网元的执行结果并不影响整体业务的成功与否,因此需要制定相应的容错机制,以屏蔽这些网元执行失败带来的影响。对于非核心网元,系统将自动识别,无需等待该类型网元施工完毕,即可认为整个工单业务施工完成,极大地加快了业务开通能力。

3 系统派单调度方案设计

系统拆分为小的功能性模块后,最关键的问题是模块间派单及消息通信的问题,需要对派单调度实现以下关键功能:

3.1 内存调度

消息通过内存进行调度,包括两方面,内存数据库和jvm内存。

利用内存数据库队列缓冲接口消息,避免消息直接落地,影响接口的交互性能,处理模块可异步扫描队列进行后续处理。同时内存中消息报文成为中心共享数据,计算处理模块通过访问缓冲的消息数据,完成计算处理,节省磁盘IO开销,提升性能。

利用内存数据库队列交互模块数据,上下游模块直接通过内存读写,极大地提升了处理能力。

采用线程并发模式,在jvm基础上实现多队列,多线程处理,针对接口、模块间消息分配jvm内存队列,以实现派单队列的二级缓冲,加快数据流转。

3.2 进程守护

在分布式架构的前提下,各处理单元通常是独立的进程,在调度队列时,需要保证调度操作的原子性,即同一个消息,不会被重复多次调度。采用守护进程的方式,结合应用的冷备模式,确保处理单元的持续工作能力。即通过一个守护进程,定期发起对守护对象的检查,监听进程PID信息判断进程是否存活,可以根据配置策略,对存活进程发起自动拉起,或者发送短信通知到系统管理员,对进程进行手工重启。

4 缓存及异步持久化方案设计

系统高性能实现的设计原则为“一次计算,异步持久”,计算过程通过分布式应用部署,最大化利用CPU、内存和网络IO资源完成高并发处理,利用消息管道,衔接关系型数据、内存数据库和文件化持久操作,实现IO异步化。

基于以上原则实现的高性能系统,要实现以下关键功能:可根据需要选择落入大数据平台或转存到集中的文件服务器当中。

4.1 利用内存数据库缓冲报文消息

利用内存数据库缓冲接口消息,避免消息直接落地,影响接口的交互性能;

让消息报文成为中心共享数据,计算处理模块通过访问缓冲的消息数据,完成计算处理,节省磁盘IO开销,提升性能。

4.2 配置缓存,降低IO交互

应用启动过程加载配置数据,缓存在进程内部,有效降低计算过程中配置数据在数据库中的访问调用,减少应用和数据库的交互次数,提升系统的处理能力。

4.3 嵌入式队列,保障持久高性能

计算过程结束后,消息对象避免经网络IO传递到其它模块完成持久,实现嵌入式队列,由计算模块中的持久线程池完成消息处理,持久对象落地数据库或者文件系统。

4.4 文件化系统处理大消息持久

利用文件系统的IO能力,应用程序通过队列异步本地存储大报文消息,避免大消息落入关系型数据库,存放成LOB结构,可有效降低数据库开销,充分利用系统的整体资源。

5 流水线结构在即時开通激活系统的应用情况

去IOE架构的即时开通激活系统,整体设计借鉴了互联网高并发高性能高扩展的设计思想,应用了业界成熟的开源解决方案,抛弃了传统重型的EJB架构设计,改用轻量级多进程集群,运行在X86架构虚拟资源池上,历史归档和过程数据分离,过程数据分功能存储于Oracle(支持MYSQL集群),采用分布式缓存、异步IO和事件驱动等技术大幅提升性能。

在新架构中,我们引入了分布式缓存REDIS技术,每个REDIS实例均有主备节点,确保缓存数据的安全性,不仅存储配置数据,还存储工单处理过程数据。在激活的多进程架构下,这些缓存中的过程数据可以跨进程共享,大大降低了生产数据库的IO消耗。

在新架构中,我们借助REDIS内存数据库,将进程通知消息写入内存队列中,消费进程异步读取,队列性能较传统JMS和数据库表都提升了一个等级,消息在队列中透明可控,维护成本也大大降低。

新架构的即时开通激活上线应用后,效果明显:采用云化部署,效率高、容灾能力强;工单处理速率高,比原系统提高10倍;表空间使用少,比原系统节约空间综合约7倍。

猜你喜欢
队列分布式
队列队形体育教案
队列里的小秘密
在队列里
基于预处理MUSIC算法的分布式阵列DOA估计
丰田加速驶入自动驾驶队列
向强军冲锋(队列歌曲)
西门子 分布式I/O Simatic ET 200AL
家庭分布式储能的发展前景