金融交易体系结构的演变

2020-07-29 15:39:13

Martin Thompson是一位Java冠军,拥有20多年构建复杂和高性能计算系统的经验。他最近为人所知的是他在副翼和SBE方面的工作。在LMAX之前,他在创建The Disruptor时是联合创始人兼首席技术官。他在Mechanical-sympathy.blogpot.com上写博客,并提供性能和并发方面的培训课程。

软件正在改变世界。QCon通过促进开发人员社区中知识和创新的传播来支持软件开发。QCon是一个实践者驱动的会议,专为影响团队创新的技术团队领导、架构师、工程总监和项目经理而设计。

汤普森:事实上,十年前,在这个QCon上,我第一次公开谈论LMAX和The Disruptor。戴夫·法利和我做了第一次演讲。当时我们有一个吸引眼球的标题,我们说,我们可以在不到1毫秒的延迟内,每秒处理100,000笔交易。这在当时是相当酷的。如果你看过的话,大多数系统都没有做到这一点。一些金融交易所就在那个空间里。以这样的速度运行的应用程序非常少。我们谈论的不仅仅是系统的核心。我们谈论的是通过网关传入的外部请求,对其进行处理,使这件事变得可靠,并在不到一毫秒的时间内响应客户。我们就是这样跑来跑去的,有时候我们会更糟一点。有时候我们会好一点。平均来说,我们当时就在那里。十年过去了,是不是好了十倍呢?有意思的。我们现在的金融交易速度是每秒100万笔吗?我已经不在LMAX工作了,所以我不是在谈论这个。

一般来说,在交换空间。其中一些更好的是在这个性能水平上的。我们在数量和吞吐量上都有所上升。那么延迟呢?我们从1毫秒降下来了吗?是的,实际上很多。我们是不是降到100微秒以下了?周围最好的交换远低于100微秒,通常降到几十微秒。我不能确切地说出一些人的速度,但他们非常低。在这段时间里发生了很多非常有趣的变化。这就是我想要谈论和经历的。

四个主要主题。看看事物是如何演变的,特别是设计是如何演变的。我们如何在这个空间中使事物具有弹性、容错性和健壮性?这也是非常重要的。然后那里发生了一些根本性的变化。业绩大幅提升。在过去的10年里,我们部署这些东西的方式也发生了相当大的变化。这些都包在一起了。它们并不是真的截然不同。它们都是相互作用的。他们在一起有一些有趣的玩法。

让我们先从设计开始吧。如果你看一家交易所,它们都是以相似的方式设计的。通常,它们是状态机。您将一组输入应用于给定的状态,从而将其带到一个新的状态。这是相当古老的计算机科学。它已经存在很长一段时间了。如果你在看状态机的类型,那就是米利和摩尔。大多数都是典型的Mealy状态机,我们在那里重新应用输入。将您的输出或输入的状态转换为状态,我们就会得到一个新的状态。事情往往就是这样运作的,非常简单。大多数人不会这样构建应用程序,但是我们的大多数程序都是状态机,不管你喜欢与否。在它们的工作方式上,它们可能不是特别好定义的状态机。这些系统需要对此严格得多。

特别是,我们希望查看复制的状态机,因为我们希望某些东西是可靠的。它需要位于多个节点上,这样我们才能容忍故障。然后,我们可以恢复并继续进行操作,而不会丢失客户数据、状态等信息。要做到这一点,我们必须对我们的投入品进行排序。每个状态机必须获得相同的有序输入集才能得到相同的结果。当事件改变状态时,这些命令的执行必须是确定性的。里面有一些相当令人惊讶的东西。这里的大多数人都不知道,如果您在Java中使用HashMap编程,那么如果您遍历它,它就不是确定性的。有些事情会让你大吃一惊。许多数据结构并不是确定性的,这让人相当惊讶。我们需要确保所有状态更改都是确定性的。我们需要有能力处理这件事。如果我们做到了这一点,我们就会在多个复制的状态机上得到相同的状态和相同的输出集。这给了我们可靠性,给了我们容忍失败的能力。

我们最终构建了一个分布式日志。大多数人都会记录这些输入,然后进行处理和回复

最酷的是,一旦你有能力以一种很好的确定性方式处理这些事件,我们就不再处理数据库了。我们并不是在处理所有这些可怕的东西,比如ORM之类的东西。你有这些非常好的富域模型,这在金融界实际上是一件很棒的事情。这是你可以做的很酷的事情之一。比如匹配引擎,风险系统,监控系统,所有这些。它们是非常丰富、有趣的领域问题。我们可以用非常纯净、非常优雅的模型来制作它们。这也是一个有趣的工作空间。在这些域模型中,我们的对象之间有很多关系。为此,我们将用一些东西来表示这些关系,这就是数据结构的用武之地。你可以做很多很酷的计算机科学,要么挑选数据结构,然后选择正确的结构,要么甚至从头开始设计数据结构。要制造最好的匹配引擎,没有现成的数据结构可以做到这一点。您最终需要专门为此目的设计数据结构。结果,它的效果真的很好。如果你在那个地方工作,你可以做很酷的事情。事实上,一些世界上最优秀的人在匹配引擎方面工作,这几乎就是他们所做的一切。他们可以设计这些东西,并在一个凉爽的空间里工作。这是一个计算机科学问题,也是一个领域建模问题。

在这个空间里,这是我在过去10年中看到的演变,特别是我们如何处理时间。在这个空间中,时间是一个非常有趣的问题,因为所有机器的时间都需要一致。你不能读取系统时钟。这在这里从来不会发生。这不应该发生。有时是这样的,然后事情就会出问题。我们必须迎头赶上,以其他有趣的方式处理它。我们通常在事件进入系统时给它们加时间戳,甚至可能在硬件级别给它们加时间戳,方法是使用非常精确的时钟将时间戳放到网络数据包上,并遵循与GPS同步的原子时钟。我们可以在这个水平上非常精确,这是一件很好的事情。

如果我想设个计时器呢?如果我在交易所下单,那单就进了。十分钟后,如果它不匹配,则必须取消,或者甚至可能在10秒甚至10毫秒后,如果它没有立即启动,您可能想要取消它。我们必须为此设置计时器,并等待超时发生。如果它在此期间失败,您将不会启动该计时器,您需要取消该计时器。如果它没有失败,你想让计时器关闭并处理它。如果你有一个复制的状态机,你在这里做什么?一种典型的方法是脉冲输入时间戳。你看,有一段时间已经过去了。那么你正在阅读它,你正在查找并离开,有没有需要过期的计时器?在那里有一个非常有趣的计算机科学问题。您如何管理大量计时器并有效地处理它们?诸如定时器轮和优先级堆之类的东西。有各种很酷的数据结构来处理这一问题,操作系统领域对此进行了很好的研究。你可以从那里画画。

这些事件进入您的日志后,最终会记录在您的日志中。如果您希望在您的时间上有非常高的分辨率,那么您最终会在日志中记录很多事件。如果您想要有微秒的时间戳,那么您的日志中将会有每秒一百万个事件,只需处理时间即可。你也需要用一些有趣的方式来处理这个问题。有几种方法可以做到这一点。如果基础设施是为了解决这个问题而建造的,那实际上会更好。我看到人们经历了不同的方式来做到这一点。现在人们几乎都承认,你需要在基础设施中做到这一点才能做得好。有解决方案可以做到这一点。只是意识到这其中的一部分。

在这一点上,公平方面也有了很大的进步。任何从事过金融工作的人都会知道,这几乎是一场被操纵的游戏。长期以来,它一直受到银行和大公司的操纵。我们现在有零售客户在做生意,而且我们有很多新的人进入这个市场。公平正在成为人们想要的东西。它正在改变。我们甚至可以看到,在我们会得到不同做市商的市场上,他们正在互相较量。他们不按规则打球。高频交易商店做了很多这样的事情。我们需要想办法让它更公平,如何让它更透明。这导致一些交易所的设计大不相同。

这里有一个例子。十年前,交易所应该是这样的。我们有多个面向客户的网关。我们可能在后面有两个匹配的引擎。有一个人在那里带走了爱

我们将转移到此模型,在此模型中,我们只有一个网关,将连接到匹配引擎。还有一些其他的事情正在发生,我们重新认识到主要的、次要的容错手段是不够的。我们有多个匹配引擎。我们如何处理繁重的负载,特别是处理互联网?我们确实有多个网关,但我们正在按客户分类设置网关。根据规定,将互联网客户与主机托管客户区别对待是完全可以接受的。他们是不同类别的客户,他们可以获得不同级别的服务。在一个分类中,它们对于一项服务都应该是相同的。一个网关可以是互联网。一个网关可能是远程人员。一个网关可以是交换处的共同定位的人。我们可以用不同的方式把它们分开。这给了我们一点偷窃的能力。我们还得让所有的车辆通过。我们必须把重点放在这方面的表现上。

我们可以扩大规模的另一种方式是,我们可以扩大匹配引擎的规模,并通过按工具或资产类别或其他我们没有关系的工具进行分片来填充它们自己。一些市场很有趣,工具之间存在相关性,我们将处理这些市场的流动性,因为有些东西是可以替换的,或者可以通过计算来替换。我们得到了一点,有时它实际上是很容易,只是通过处理工具或不同的资产在那个时间点的碎片。您可能在其中一个上有索引。你可能在另一个地方有外汇。你可能对另一个人持有股票。你可能在不同的交易所拥有一些最大的股票。我们会分开处理这件事。我们正在看到基础设施的这种不断发展的布局。

我们也看到了资产类别向交易所交易的转变。我们有很多场外交易。我们过去有很多自营交易和基于经纪人的交易,更多的交易正在转移到交易所,因为在交易所,它更公平。它是相等的。有更好的方法来处理这个问题。我们在这个领域获得了更多的活动,在过去的几年里,在这个领域交易的加密货币和其他密码工具也出现了爆炸性增长。外面有很多新的交易所,这已经开始发生了。实际上,我希望看到这种情况开始发生的一件事是,我们现在开始进行能源交易。在过去的几年里,我与一家为欧洲做能源交易的公司合作,在欧洲,可再生能源已经成为一个有趣的问题。你有风了。你买了太阳能。它们是不可预测的。你可能会发现欧洲的一部分风很大,而欧洲的另一部分风不大。我们需要转移这种能量。我们需要合作。我们需要一种飞快的交易方式。这些东西现在也开始进行交换了。在这里发生的非常酷和有趣的事情。

这就是设计空间的发展方向。我们的韧性何在?具体地说,我们如何使事物具有容错性?通过容错,我们能容忍一个错误,继续前进吗?十年前,金融界的每个人都在做主要的、次要的工作,在那里你有一个节点,而这个节点就是你的主要节点。你所有的交通都要经过那条路。它正在备份到辅助节点。在主节点出现故障的情况下,您可以转到次节点继续处理。这不是一个很好的方法,当你真正从你想要为客户提供的服务来看它的时候。里面有几样东西。如果您有两个节点,并且在那里出现故障。您不能自动决定哪个学校应该成为新的主要学校。通常,您会在凌晨2点以失败告终。有人下了床,想为此做点什么,结果搞砸了,因为他们还没喝咖啡。我知道呀。我也遇到过这样的情况。您希望该方法能够自动选择哪个节点是作为主连接的理想节点,然后继续前进。

它实际上比那更大。你开始和律师讨论为什么我们有容错能力。如果我在市场交易,特别是如果我允许零售客户进入市场交易,因为他们应该得到比专业交易员更多的保护,因为他们没有意识到同样水平的风险。如果我以零售客户的身份进入市场交易,而主要客户死了,我们就去第二个客户那里。看起来很公平,我们可以继续。您现在正在辅助服务器上运行。如果次要服务器出现故障怎么办?您现在没有数据。你无法证明发生了什么事。律师对这种情况感到不舒服。如果你要从小学转到中学,你唯一要做的就是