HasuraStorage是一个开源服务,它在hasura和任何s3兼容的存储服务之上添加了一个存储服务。它的目的是能够利用云存储服务,同时也利用hasura的特性,如它的graphqlAPI、权限、动作、预设等。由于业务发展需要,HasuraStorage团队最近重写了他们最初用Node.js编写的服务在高朗。“这个用Node.js编写的服务为我们服务了相当长的一段时间,但随着公司的发展和用户数量的大量增加,性能开始成为一个问题。虽然Node.js可能有很多优势,但性能出色可扩展性不是其中之一。”HasuraStorage表示,用Golang重写后,可以处理5倍的服务请求,同时内存消耗减半。据介绍,他们选择Go的原因是:该语言的依赖管理系统和构建系统使其非常适合forthecloud团队拥有丰富的Golang经验,虽然Go是一种非常冗长的语言(尤其是与Node.js相比),但是它非常容易学习,编写速度很快并且非常高效重写完成后,HasuraStorage团队运行了一些基准测试针对Node.js和Golang版本的服务。使用k6并设计了以下测试:当测试开始时,它会在前10秒内将工作人员数量从1增加到TARGET,然后再运行60秒,然后结束。Workers尽快查询服务运行以下测试:download_small_filedownload_medium_filedownload_large_filedownload_imagedownload_image_manipulatedCPU被限制在e的10%整个系统RAM是无限的HasuraStorage前面声明最终结果不应以表面价值为准;“用于基准测试的系统的CPU容量非常有限,因为我们想对这两种服务进行压力测试,看看它们在压力下的表现如何,所以我们感兴趣的不是数字,而是两个版本之间的差异。”测试结果表明,HasuraStorage可以处理的请求数量在每种情况下都有显着增加,对于较小的文件(5倍)效果更为明显。还设法在所有情况下显着改善RAM消耗,尤其是在下载大文件时。值得一提的是,这是在服务多达5倍的请求的前提下。另一个重要指标是响应时间。HasuraStorage提供了两个数据:最小响应时间,开源告诉我们系统没有压力时的响应时间;而P95,开源告诉我们大部分用户的响应时间最多是多少(包括系统承受压力的时候)。首先是最短响应时间。测试用例download_small_file的结果从图中不太容易看出,但HasuraStorage声称其将场景响应时间从Node.js用例的29ms提升到了Golang用例的7ms。除了download_image_manipulated实现了大约2倍的改进外,所有其他场景都实现了4倍的改进。然后是P95。除了download_image_manipulated和download_large_file之外,大多数情况下都实现了4倍的改进。HasuraStorage解释说,虽然不像其他情况那样引人注目,但两种情况都有实质性改进。“这是有道理的,因为下载大文件受I/ONET限制,而处理图像受CPU限制。但即便如此,我们还是很高兴看到这种实质性改进。”此外,图像处理也得到了改进。在服务被重写和测试后,HasuraStorage将服务部署到生产环境中,重写的一些好处开始显现。如下图(集群一个节点的RAM使用率)所示,内存占用减少了近40%。“这是一项重大改进,使我们能够在不增加整体基础设施成本的情况下为更多用户和流量提供服务。”HasuraStorage表示,他们决定重写该服务以提高性能指标;在对这两种服务进行并排基准测试后,他们还可以自信地声称他们设法显着改善了所有指标。“我们希望能够在使用更少资源的同时满足更多请求,同时还可以缩短用户的响应时间,我相信他们会喜欢的。”
