近年来,在全球经济复苏疲软叠加疫情冲击的背景下,全球交易所核心系统稳定性面临较大考验,软件故障频发。针对软件缺陷类故障无有效应对方式的现状,中国金融期货交易所(以下简称为“中金所”)自主设计研发打造了异构交易系统,该系统是一套软件架构与主交易相异的容错备系统,通过多版本容错技术、维护多个异构交易系统来降低服务的整体故障率,在主交易系统发生严重软件缺陷、且已有的应急保障措施均失效的情况下,可尝试快速接管,持续为市场提供基本的交易及行情服务。
一、关键技术问题
如何提升软件可靠性:软件可靠性是软件质量体系中最重要的衡量指标之一,根据软件可靠性理论,缺陷是无法完全穷举罗列的,无法完全避免。中金所已具备完备的硬件故障恢复体系,应对软件故障也有较丰富的应对手段,如图1所示,但面对其他软件逻辑缺陷或架构级别严重缺陷类故障仍缺乏解决方案。
极简架构下的高性能:交易核心系统对性能容量有着极致的要求。建设一套全新的系统需要较大资源投入,一是研发阶段的成本投入,需要实现所有线上业务功能;二是运维阶段的成本投入,需要同时维护两套线上系统。因此,在资源极简的前提下,如何实现高性能目标也是难点之一。
切换影响最小化:当主系统发生软件故障切换到异构交易系统时,需要尽可能降低内外部影响。一方面是切换效率要高,对市场无影响,会员端需要做到无感切换;另一方面是对交易所内部上下游系统无影响,需要做到切换后周边各业务系统持续平稳运行。
数据一致性:异构系统与主系统架构不一致,存在业务不一致的风险,如何保证异构系统接管后仍能正确运行不出错,也是关键之一。
“卡脖子”问题仍需攻关:面对严峻多变的国际形势,提升交易所技术的安全自主可控性更是迫在眉睫。打造核心技术的安全自主可控体系、探索交易所核心系统在自主可控环境落地,才能在面对不同局势时从容不迫。
二、异构交易系统架构介绍
异构交易系统内部异构于主交易系统,采用了以高性能通信组件为连接件、多级交易流水线为中心、内置查询业务和行情生成的架构,外部复用了主系统前置和外围系统。异构交易系统总体架构如图2所示:
高性能通信组件是中金所在多年来交易系统研发的基础上,对底层开发框架及通用功能组件进行分离封装,形成的一套功能丰富的开发框架。开发框架由C++实现,包含了事件处理框架、高性能通信、可靠多播、高级容错组件等。
多级流水线模型是异构交易系统的消息处理架构,异构于主交易的业务单线程处理,后续章节中将详细介绍。
内置查询业务和行情生成是考虑到查询模块和行情生成模块的轻量性及其与交易行为的耦合,将这两个模块纳入异构交易系统核心进程中,可降低异构系统运维的复杂度。
复用主交易前置和外围接口模块可以保证在切换时省去反演恢复数据的时间,提高切换效率,并且可维持切换后对外服务地址不变,降低切换对会员端及交易所内部上下游系统的影响。
从运行方式与数据流向上来看,异构交易系统日常作备并行运行,实时订阅主系统撮合结果流水,实时恢复最小完整状态集。当主交易系统出现故障切换至异构交易系统时,开始订阅外部前置及上场消息继续进行交易业务。
三、系统关键技术
1.运行模式及流水复制恢复技术
异构交易系统支持两种运行模式:撮合模式和恢复模式。运行模式属于架构层的概念,它决定了系统的订阅关系、流持久化逻辑等。详细介绍如下:
撮合模式:异构交易系统做主系统运行,从上场模块进行初始化,从交易前置接收外部指令(如报单、报价等)。业务层进行撮合操作,撮合结果直接写入结果流。此模式下与主系统运行模式无异,当主系统故障切换至异构系统时,异构系统以此模式运行。
恢复模式:异构交易系统作为备系统运行,此时作为主系统的并行系统,将订阅主中心发来的全量流。此模式下应用了流水复制恢复技术,只处理结果消息,用来复制主中心的撮合结果,恢复构建对应业务域状态、内存表以及相关变量的状态,如资金占用、仓位统计、活跃订单簿等,保证异构一致性。收到切换指令后,异构交易系统会切换为主中心,发生订阅关系和业务层操作模式的变化:取消订阅主中心结果流,转向订阅上场模块消息,开始接收前置的外部消息,业务层操作由流水复制恢复切换为撮合。线上运行默认为此模式。
2.基于聚合根的多层领域模型
通过抽取基于交易参与者+合约的最细粒度数据聚合根,将不同业务域数据按层级进行挂载,实现数据访问的简化和高效率,对原主交易系统的业务模型进行了完全的重构,通过异构避免严重故障,提升了软件可靠性。
全新的领域服务校验模型内部通过业务功能、领域模型、内存数据三层进行划分,配合数据聚合根,业务逻辑不再关心数据存取访问,模型抽象程度更高。同时,领域服务不依赖外部系统、不保存状态,所以更容易进行单元测试,这对于提高系统的质量是非常有帮助的。
3.高性能多级流水线模型
异构交易系统的消息传递采用多级流水线模型,将业务数据处理流程在逻辑上划分成相互独立的若干部分,每个部分由一个线程驱动,线程之间共享消息队列。
从总体业务模型的角度上来看,如图3所示,相比于主交易系统的订阅->单线程撮合->发布的结构,异构交易系统将撮合线程按延时占比拆分为撮合前、撮合、撮合后三部分异步处理消息。
在同一测试环境进行测试,多级流水线性能提升显著,具体如表1所示。引入撮合流水线后,系统吞吐能力显著提升。由于架构上进行了本地持久化的原因,延时略微增加,但仍在合理范围以内。
从技术模型实现来看,异构交易系统的业务处理部分由四个线程驱动,分别为订阅消息加工线程、撮合前检查线程、撮合及撮合后处理线程、发布消息处理线程,与图4中线程一一对应。其中,订阅消息加工线程将异构交易上行的消息包进行解包,生成消息队列的包头以及流水线的第零级消息,消息队列包头是多个线程访问消息队列的关键,控制着线程对同一个消息的读写权限,第零级消息通常是上行数据包的原始数据,也就是输入的请求包;撮合前检查线程消费消息队列包头和第零级流水线的消息,同时生成第一级流水线的消息;撮合及撮合后处理线程消费消息队列包头和第零、一级流水线的消息,同时生成第二级流水线的消息;发布消息处理线程消费消息队列包头和第零、一、二级流水线的消息,并将消息打包,提供给其他模块消费。消息队列保存了每一级流水生成的消息,并维护了消息之间的对应关系。
其中,动态消息队列是为了适配多级流水线模型而设计的组件,它的生产消费模式与多级流水线模型是紧耦合的。对于消息队列而言,订阅消息加工线程是生产者,发布消息处理线程是消费者,撮合前检查线程和撮合及撮合后处理线程既是生产者又是消费者。
在动态消息队列中,消息头的结构至关重要,对于一个原始请求消息及其在各级流水线中生成的衍生消息,消息头记录了流水线的处理结果和上一级处理该消息的流水线序号,各级流水线通过消息头判断消息是否可读。动态消息队列内部实现大致如图5所示。
4.架构极简及业务极简
在技术架构方面,异构交易系统主要用于应急场景,因此在架构上剥离了分布式容错撮合集群,仅保留订单、行情关键路径模块,构成最小完整状态集,使得架构层代码减少20%。
在业务架构方面,基于全新的抽象程度更高、基于聚合根的领域服务业务模型,剥离了非必须业务,仅保留交易业务最小集,去除了为扩展性预留的以及未开启的业务功能,在确保业务延续性的同时,保证了业务应用层的简化,精简了核心计算逻辑。以不同的实现方式重构之后,实现了相同的业务功能,业务代码行数减少55%,减少了开发成本。
在模块架构方面,对比主交易系统,考虑到查询模块和行情生成模块的轻量性及其与交易行为的耦合,将这两个模块纳入异构交易系统核心进程中。除了复用的主交易前置及外围模块,异构交易系统仅有一个进程,保证了异构交易系统的轻量级和灵活性。
5.运维视图及故障根因分析系统
为了实现故障的快速发现和定位,在开发异构交易系统的同时,交付了一套基于大数据、集成了运维视图及故障根因分析系统的智能运维平台,实时跟踪主交易系统及异构交易系统运行状态。
根因分析系统融合了Logging+Tracing+Metrics的监控设计理念,定义了异构交易系统健康运行五大黄金指标:通讯量、错误率、资源饱和度、进程状态、同步数据落差,通过数十个监控子指标监控系统运行状况,运用Splunk搭建了运维指标视图,所有指标均支持分钟粒度告警和回溯,实现了事前监控、事中定位、事后回溯的全时段功能。
指标监控报错监测到故障时,可通过根因自动分析系统(图6)查看故障根因,也可通过日志全链路追踪,进行主系统的故障发现及定位,大幅减少根因定位时间,快速为切换异构交易系统决策提供辅助依据。同时,智能运维平台也支持一键切换,切换至异构交易系统后同样可持续监控异构系统作为主系统运行时的各项指标。
智能运维平台针对日常运维和特殊排障场景提供了全面的运维方案和体系,减少了异构交易系统的运维成本。
6.平滑切换
接口一致性:异构交易系统在设计开发中维持对外API及对内上下游系统接口不变,使得切换时会员端系统、所内上下游系统可持续平稳运行。在故障切换时,对外会员无需任何操作,做到会员端无感知。对内支持断点续传,保证了数据一致性与完整性。在业务层面保证了平滑切换,切换后的所支持的业务也维持不变。
业务一致性:异构交易系统以备模式运行时,实时接收来自主系统的数据,并将数据进行重构,使得异构交易系统的数据及状态与主系统保持一致。以主模式运行时,为了保证重构结果的一致性,通过近年的交易流水反演比对和同步一致性比对,验证了异构交易系统在主模式下与主系统业务功能结果完全一致。业务一致性保证了切换后异构交易系统可平滑接管业务。
为了保证异构交易系统与主交易系统的业务、行情的一致性,采用了两套同步一致性比对方案:
一是实时接收主交易系统和异构交易系统恢复模式下的撮合结果及行情流水,进行交易结果数据、行情发布数据的业务比对稽核,确保在恢复模式下主系统与异构系统的数据一致性;
二是在并行环境上部署了一套以撮合模式运行的异构交易系统,实时接收主中心的请求消息并进行撮合,将撮合及行情结果与主中心进行比对。此系统仅用作撮合模式的结果比对,验证异构系统撮合模式的正确性,不参与应急切换。
极速切换:异构交易系统复用主交易的交易前置和行情前置,切换后核心与前置均无需进行反演就可直接进行交易,除去停止主交易核心进程和决策的时间,可以做到秒级切换,最大程度保证业务连续性。
7.国产化自主可控
异构交易系统在设计阶段充分考虑跨平台运行需求,在组件开发阶段严格在自主可控环境进行测试验证,确保自主可控环境的可用性。在基于X86_64架构、浪潮服务器、麒麟操作系统、海光CPU的自主可控环境上,异构交易系统的各项功能平稳运行、延时及吞吐的性能指标达标,并在自主可控环境成功上线,平稳运行至今。
在功能方面,异构交易系统在自主可控环境上累计执行回归测试用例14余万条,并通过了近两年的生产流水反演比对测试;在性能方面,对环境特性及参数进行了分析和调优,使得性能提升了8%,异构交易系统在自主可控环境中的报单吞吐量为9万笔/秒,报单延时约为150微秒。
四、系统建设成效
提高交易所业务连续性保障能力。交易系统是交易所核心竞争力的重要体现,是金融市场中最为核心的交易基础设施。异构交易系统上线后,可提高核心系统的整体可用性。在主系统可用性为99.999%的情况下,主系统每年的宕机时间为36秒以下,而加入了异构交易系统后,在异构系统本身可用性为99%、异构率为50%的情况下,根据计算,整体系统每年的宕机时间将下降为18秒,且随着异构率的上升,宕机时间还将继续减少。异构交易系统的上线,有效提高了交易所的业务连续性保障能力,降低了技术故障对市场的冲击,在保障金融市场安全稳定运行方面起到重要作用。
探索实践下一代核心系统。异构交易系统作为具备主交易系统完备业务功能的异构系统和下一代交易系统的原型,在简化了部分可靠性保障机制的情况下,比照全面建设一套新系统再上线的时间周期,异构交易系统在上线周期上大约可缩短60%。其在生产环境上的运行,绝大部分时间在作备的场景下运行,既能作为主系统软件故障时的应急补充,又能使其经历生产环境真实场景的考验逐步迭代完善,大大降低了下一代系统验证的成本。此外,异构交易系统中投入使用的更先进的框架、组件、模型等不但可作为下一代核心系统的技术底座,还可以在其他项目组中被复用,也可为公司节省下一定软件研发费用,并缩短研发周期。
核心系统自主可控环境落地。异构交易系统在设计阶段充分考虑跨平台运行需求,在开发阶段严格在自主可控环境进行测试验证,确保系统在自主可控环境的可用性。在基于国产海光服务器、麒麟操作系统的自主可控环境,异构交易系统运行平稳、各项功能正常、延时及吞吐等性能指标达标。异构交易系统在自主可控环境的成功落地,实现了软件层硬件层双异构,提升了核心系统在基础设施层的自主可控性。
五、总结与展望
本文对异构交易系统的技术难点、架构、关键技术分别进行了介绍和阐述。异构交易系统在大规模数据量、极低时延要求的应用场景下,可实时接替主系统提供全量交易服务,大幅提升核心系统的可靠性,降低由于软件故障导致系统性风险发生的可能性。同时在自主可控环境中,维持内部延时基本不变的前提下,相比非自主可控环境撮合吞吐仍可提升135%。
目前,异构交易系统已在生产环境顺利上线,成功作备并行运行至今。同时,在测试演练方面,先后组织了多次自主可控生产环境的会员切换演练,在会员接入的情况下,成功从非自主可控主核心系统切换至自主可控异构交易系统,业务持续平稳运行。
未来随着中国金融市场的发展,各家交易所的系统复杂性必然会不断上升,外部环境也趋更加变幻莫测,“交易不断,数据不乱”的目标仍会是重中之重,如何在软件层面建立完备的容错机制就显得更加重要。异构交易系统将结合各家交易所先进经验,持续探索优化,为金融市场稳定运行作出贡献。