如何将加密货币交易所的交易引擎扩展到100万TPS

2020-08-11 19:29 栏目:经验之谈 来源:网络整理 查看()

随着密码货币适应性的提高,密码货币交易的需求日益增长,大量新的代币投入交易,显示出巨大的潜力,吸引了用户。

交换平台由许多组件组成,这些组件相互通信以实现功能,但交换中最关键和最核心的组件是匹配引擎,它可以接受多个订单、维护订单、执行计算并同时启动交易。

它之所以成为最关键的组成部分,是因为一次失败或任何错误的计算都可能使交易所面临风险,这主要会在财务上破坏用户的信任。

我使用node.js、typescript和rabbitMq制作了初始匹配引擎,它运行非常平稳,没有延迟和失败。但是,当企业级解决方案需要将订单放到更高的级别时,会注意到事务延迟,服务器崩溃会消耗100%的CPU容量,并且消息队列开始阻塞。

当这些问题被检查出来,这意味着它不仅需要一个小的变化,但必须重新设计和建立。

交易平台是根据微服务架构构建的,因此我们可以考虑和尝试这样的修改和重新设计。

众所周知,“节点”并不是这种处理级别的最佳技术,因为它具有高数据负载和低延迟。

一般来说,任何CPU密集型操作都会抵消节点通过其事件驱动的非阻塞输入/输出模型提供的所有吞吐量优势,因为当线程被数字处理占用时,任何传入的请求都会被阻塞。

在向多核服务器添加并发性时,核心节点团队已经以集群模块的形式完成了一些工作。

但是,仍然使用集群,因此所有繁重的计算都应该转移到在更合适的环境中编写的后台进程,并且它们应该通过消息代理相互通信。

选择GO LANG

选择多核系统并提高并发性并不能保证相应的速度提升。笨拙的并发控制会使多核的情况变得更糟。

Go为高度可伸缩的并发控制提供了一些非常好的设计选择。

这是一个过程吗?不

这是一根线吗?不

例行公事?是

上下文管理

当涉及资源共享和上下文管理时,当并发任务共享处理器和内存时,要处理的任务数量通常会超过可用的处理器。

它所需要做的只是暂停和恢复执行,但它非常有效。

上下文切换过程需要许多昂贵的操作,例如:

找出下一步要运行的流程,并等待/暂停流程管理

备份所有当前的中央处理器寄存器,并将所有中央处理器寄存器恢复到下一个进程

刷新虚拟内存缓存

所有操作都在内核中运行,因此您可以管理操作系统的内核模式和用户模式之间的切换。

线

线程类似于进程,但是它们共享地址空间,因为线程比进程小。

线程比创建和切换游戏的过程更快,但是仍然有上下文切换开销。

对于线程和进程,内核需要备份/恢复整个寄存器,因为内核不知道正在使用哪些寄存器。

创建线程时,它会为其堆栈分配固定的大小,而不考虑所需的堆栈大小,这限制了一次运行的并发任务的数量。

围棋套路

与线程相比,围棋程序的上下文开销最小。

GO-routine也有合作调度,这将切换到最小化。它们仅在定义明确的条件下切换上下文,如通道发送/接收操作、GO语句、阻塞系统调用(文件/网络输入输出)和垃圾收集。

如果你不合作,饥饿很可能会发生。

Go编译器将为每个上下文切换事件的寄存器检查和备份发布代码。

Go编译器知道给定函数需要多大的堆栈。它首先分配一个非常小的堆栈。在函数调用之前,Go将检查当前堆栈是否能够满足函数堆栈大小的要求。如果这还不够,它将根据需要动态增加堆栈大小。反之亦然,它还可以减小堆栈大小。因此,运行例程可以保持必要的堆栈大小,并允许最大的并发运行例程。

Go在多核系统上是特殊的,因为它的智能设计选择,它对于上下文管理是非常便宜和快速的,并且GO例程的动态堆栈大小管理允许更多的并发性。

比较节点引擎和运行引擎

在构建新系统后,是时候比较两个系统的可扩展性和效率了,结果令人振奋。

Go引擎的结果如下

高并发性

低延迟

事务速度/吞吐量计算为14微秒

所有内核的CPU使用率都得到很好的管理

结论

选择简单有效的东西总是有效的。我本可以设计一个有许多队列、后台工作人员等的复杂系统,但是我决定利用Go-lang提供的高效而简单的并发方法。

工作中总是有合适的工具,了解这些工具会帮助你做出最好的选择。

微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:仅接受技术开发咨询!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
NFT开发,NFT交易所开发,DAPP开发 Keywords: NFT开发 NFT交易所开发 DAPP开发