一、 电子交易系统发展概述
美国70年代的“纸上作业危机”随着全球金融业务的迅速发展壮大,资产交易领域对于核心技术的需求也在不断增强。上世纪50年代前,在传统的金融市场交易中,买卖双方通过叫价进行价格协商的方式最终达成一笔交易。整个过程主要依靠人来执行,交易以纸化方式进行,效率低下且成本高昂。随着金融市场的发展,证券种类和交易量的激增,自20世纪60、70年代开始,金融市场逐渐出现“纸上作业危机(Paperwork Crisis)”,纽约证券交易所当时甚至被迫在每周三暂停交易并缩短交易日的交易时间来限制交易业务的数量。很显然,只有计算机才能满足金融市场如此大规模的交易。至此,全球金融市场掀起了一场“无纸化”和“电子化”革命,电子交易凭借速度快、成本低、不受时空限制的优势逐渐成为当前金融资产的主流交易方式。
经过长时间的发展,世界各地的交易所出现了很多电子交易系统,主要代表有美国道富的Currenex系统、香港的INET交易系统、ICAP公司的EBS spot Ai和伦敦的Life Connect期货交易系统等。由于数字资产本身就是以电子形式作为载体,因此天然适用于电子交易系统。但数字资产作为一种新型金融资产,与传统资产相比,对交易系统的性能要求也略有不同。综合来看,对于一个数字资产交易系统,应追求一下特性:
(1)低延迟和高吞吐
延迟(Latency)和吞吐量(Throughput)是衡量一套金融交易系统性能优劣最重要的两指标。从另一方面讲,人类设计电子交易系统的首要目的就是追求交易的低延迟和高吞吐。
在金融交易系统中,延迟是指交易系统接收到一个事件请求到产生响应之间的时间间隔。低延迟的需求很大程度上来自于市场上高频交易量的迅速增长。由于数字资产交易市场是一个完全竞争的市场,在数字资产及衍生产品日益同质的当下,高频交易者可以在多家数字资产交易所进行交易,因此能够更快处理订单、更快反馈行情的交易所在市场上更具有优势。吞吐量衡量的是系统每秒处理的请求或事件数量。交易吞吐量的大小直接影响交易效率,因此数字资产交易系统的设计应该考虑极端情况,充分利用处理机资源。
(2)可维护和可扩展
相较于其他金融资产,数字资产是一种全球性的资产,其价格行情会受全球市场的影响,这导致交易系统必须满足全年24h不间断工作的要求,因此在系统设计上要求尽可能地做到避免停机维护;此外,数字资产市场是一个新兴的市场,其创新迭代的速度也明显快于其他金融市场:尽管数字资产市场的兴起不到十年,但已经出现了杠杆交易、合约、期权等多种交易产品。大量创新产品的产生对交易系统的可扩展性和可维护性提出了新的要求。
二、 OKEx Lightning System 2.0特性:More than fast
OKEx作为全球前三大数字资产现货交易所之一,全球数千万用户选择的平台,拥有市场上最齐全的数字资产及衍生品,日交易规模高达数十亿美元。作为数字资产领域的领导者与探索者,OKEx对交易系统的性能指标也有比业内更高的标准。自2018年8月交易系统架构升级开始,经多次系统升级,OKEx的新一代交易系统Lightning 2.0各项性能趋于完善,在业内已达到领先水平。从最近的系统升级看,Lightning 2.0系统主要在以下几个方面做了改进:
1. 内存撮合技术---“Keeping it all in memory”(将一切放入内存)
在数字资产交易系统发展初期,撮合处理一般采用数据库撮合,即当交易方下单后,撮合系统从数据库中读取交易方的信息,然后再从数据库中査找与它相匹配的另一方订单,判断成交数量并生成交易记录,直到订单全部撮合完毕或不能继续成交。这种撮合技术的优势就是数据一致性高,但是缺点就是处理速度慢并且无法满足日益增长的大量用户请求。
OKEx的新一代交易系统Lightning 2.0则采用了最新的内存撮合技术,即在撮合过程中,交易系统所涉及到的所有数据信息都存储在撮合引擎的内存中。并且在交易过程中减少对数据库访问,撮合结果与中间数据也完全存储在内存中,而且可以降低系统的输入输出过程。基于内存撮合可以大大提高撮合速度。
进一步地,对于现代 CPU 来说,从内存访问数据仍然不够快。从实际测试结果看,从L2 Cache中获取数据的时间只有从内存中获取的1/7。为了进一步降低系统延迟,如何利用好 CPU 缓存成为关键。CPU 在访问内存时,最小的单位是 Cache Line,通常为 64 字节。当 CPU 加载内存时,会把临近的共 64 字节的数据放入缓存。基于以上的现实,OKEx通过控制数据在内存的分布对Lightning系统进行了两方面的改进:尽管内存撮合技术能显著降低交易延迟,但却面临数据易丢失的致命缺陷:当计算机断电时,数据便不复存在。为解决这个问题,OKEx采用了事件溯源(Event Sourcing)。事件溯源是一种以事件为中心编写业务逻辑并持久化数据的方法。传统上,我们在数据库中存储数据的当前状态;而在事件溯源方法中,系统存储的是反映状态变化的事件,这让系统拥有了重建状态的能力---系统定期对状态进行快照,当需要重建时,就只需要重放自快照建立之后发生的事件即可。
ü 控制内存分布,将需要连续处理数据放在一起。当数据都放在一起的时候,读取多条数据时只需要第一次从内存加载至缓存,之后的读取都可以命中缓存,提高性能。
ü 控制内存分布,把可能高速变化的数据(例如计数器)放入不同的缓存行。当多颗CPU对同一个缓存行中的不同字节,同时进行修改操作时,会产生伪共享的问题。例如CPU1对自己的数据进行了修改,当CPU2再次读取自己的数据时,因为缓存行中有数据被更新过,CPU2必须要重新加载整个缓存行。造成两颗CPU需要互相等待。为了避免这种现象,OKEx通过填充(Padding)的方式,使得这些数据位于不同的缓存行。
2. 通讯模式---“发布/订阅”模式和二进制消息格式
目前在系统的通信方式上,主要有以下两大类型:
“发布/订阅”模式和“请求/响应”模式的区别在于:“发布/订阅”模式的通信是通过消息队列完成的,某服务需要请求其他服务时,将请求的相关信息封装成消息,发送到消息队列中,其他服务订阅该消息队列,获取信息并处理请求。
显而易见,在“请求/响应”模式中,客户端和服务端是强耦合的,两者需要同一时间可用,并且在服务端处理完请求之前,客户端只能等待,这样降低了客户端的处理速度;而在“发布/订阅”模式中,服务的调用方将消息发送到消息队列后,当前请求的处理就完成了,具有解耦特性;在另一方面,当订阅者的服务中断时,消息会持久化在消息队列中,当服务恢复时继续处理,不需要发布者重新发送消息,因此提升了系统通讯的可靠性。因此在OKEx的Lightning 2.0交易系统中,在几乎所有场景中都采用来了“发布/订阅”模型,不但提高了可用性,也提高了系统的吞吐量。
在通讯的模式确定后,下一个重要问题就是消息格式的选择,通信的本质是交换消息,消息通常包括数据。消息的格式会影响通讯的效率、通信的可演化性以及系统选择的编程语言,因此一个重要的设计,就是决定数据的格式。
从根本上来说,消息格式的选择有两大类:文本和二进制
基于文本的消息格式在性能上的缺陷是显而易见的:除消息易出现错误外,当消息比较大时,解析文本将带来巨额开销,对于像交易系统这样对效率和性能极为敏感的系统,这样的问题是无法接受的;另一方面,基于二进制的消息会用易于机器解析的方式来定义,所以性能通常会比基于文本的方式高出很多。因此,OKEx的Lightning 2.0交易系统选择基于二进制的通讯消息格式。
3. 水平扩展下的负载再均衡
为了提升系统的处理能力,必须要对系统进行处理能力的扩展。一般而言扩展分为两种方式:水平扩展和垂直扩展。垂直扩展等于升级服务器,水平扩展等于增加服务器。服务器的单一硬件性能受制于人类的生产能力,当机器的硬件配置达到一定水平时便无法再进一步提高(单一硬件性能极限),水平扩展成为唯一的选择。然而,水平扩展方式会带来负载均衡问题,即整个系统的负载应当如何分配到各个机器才是合理的?
第一个需要考虑的问题就是数据的竞争。尽管增加机器提升了系统并行处理的能力,但是如果因为不合理的分配,并行可能导致多台机器频繁产生对同一数据的竞争,系统的处理能力无法得到有效的提升。
对于交易系统而言,数据主要包括订单、用户的资金和仓位。那么为了减少这种竞争,一种分配的策略就显而易见了,按照用户进行负载分片。不同的用户的订单、资金和仓位,在处理时是独立的,这样避免了竞争,甚至我们可以再优化,对同一用户增加批处理,进一步提升系统的处理能力。另一方面,通过对交易对的保证金隔离(这里主要指的是合约交易),我们又有了负载分片的另一个维度:交易对。对于同一用户而言,不同交易对完全是独立的。这样,我们按照两个维度进行负载的分片,当系统需要增加更多的机器时,依据分片的策略,对负载进行再均衡(Load Rebalancing),达到了系统扩展的灵活性。
4. 模块拆分
提高系统可维护性、可扩展性的主要方法就是对系统进行拆分。在本次OKEx交易系统升级中,我们将原有的交易服务进一步拆分为撮合、柜台、风控模块。各模块分别维护自己内部的数据与状态。具体而言,撮合负责维护订单簿、柜台负责维护用户的仓位与余额、风控负责风险管理。
各个模块之间需要互相协作才能完成整个交易系统的功能,所以需要一种机制进行通信。一般而言,服务间通信有两种选择:共享数据和消息传递。
其中共享数据是最基本的选择:一个模块对数据进行更新,另外一个模块对数据进行查询之后,得到了新的数据,但这种方式有着显著的缺点:一方面,多个模块对同一块数据进行修改和查询,会产生竞争。在发生竞争时,数据库的响应时间会明显变长,而这种竞争在交易系统中是很常见的;另一方面,共享数据模式很难实现实时了解其他模块发生的变化,每个模块都要通过查询才能知道数据有没有发生变化。
因此,Lightning 2.0交易系统选择各个模块保存自己的数据,不与其他模块共享。当模块内部状态发生变化时,会将变化用事件(Event)的方式,发布到事件总线上。这样降低了系统各模块之间的耦合与竞争,也能在事件发生后,已最快的速度通知其他模块,显著的提升了通讯速度。
三、 Lightning 2.0系统性能数据
在2019下半年,OKEx完成了Lightning 2.0交易系统的全面升级,那么相较于原系统,Lightning 2.0的性能如何呢?
基于香港服务器进行实盘测试与系统数据统计:
首先是交易系统的吞吐量,根据11月最新的测试结果显示,系统的峰值订单处理能力可达到10万笔/秒,可媲美全球证券市场上的主流交易系统。
其次是延迟问题。一般而言,测试系统的延迟度时一般会用到以下三个指标:
我们选择系统升级前后的9月和11月的测试数据进行对比,结果如下表所示。从表中可以看出,升级后,ACK的平均延迟度由50毫秒下降至25毫秒;Live的平均延迟度由134毫秒将至63毫秒;Cancel的平均延迟度由230毫秒将至180毫秒。从上可以看出,Lightning交易系统的低延迟特性更为良好。
四. 行业探索者OKEx---用技术引领行业发展
数字空间的无限可扩展性、无限可复制性、多维可塑造性,可能意味着蕴藏在这里面的待开发的海量财富,这些新财富的表现形式就是数字资产。随着区块链技术的不断发展,在未来专利、版权、创意等资产也将转化为数字资产的形式并在网上进行交易,而市场对高可靠高性能的交易系统的要求标准会进一步提高。
OKEx交易所是全球领先的数字资产交易所之一,提供包含法币、币币、衍生品三大业务线;OKEx以其丰富的产品设计、优良的风控机制、先进的撮合引擎、安全的数字资产存储、快速响应的客户服务而备受用户推崇,同时也是世界最大的数字货币合约交易市场。OKEx明白过去任何辉煌的成绩,都是今天沉重的行业责任,OKEx的理念伴随着对于区块链及数字资产行业的责任,在未来还会继续投入更多的资源在交易系统安全以及通信协议领域进行探索,继续推动数字资产交易系统的进步和发展。