HasuraStorage是一种开源服务,它在hasura和任何s3兼容的存储服务之上添加了一个存储服务。它的目的是能够利用云存储服务,同时也利用hasura的特性,如它的graphqlAPI、权限、动作、预设等。由于业务发展需要,HasuraStorage团队最近重写了他们最初用Node.js编写的服务在高朗。“这个用Node.js编写的服务为我们服务了相当长的一段时间,但随着公司的发展和用户数量的大量增加,性能开始成为一个问题。虽然Node.js可能有很多优点,但性能出色可扩展性不是其中之一。”HasuraStorage表示,用Golang重写后,其可处理的服务请求数增加了5倍,同时内存消耗减半。据介绍,他们选择Go的原因是:该语言的依赖管理系统和构建系统使其非常适合具有丰富Golang经验的云团队,虽然Go是一种非常冗长的语言(尤其是与Node.js相比),但它非常易于学习、编写速度快且性能非常好重写完成后,HasuraStorage团队针对该服务的Node.js和Golang版本运行了一些基准测试。使用了k6,设计了以下测试:HasuraStorage事先声明,最终结果不应以表面价值为准;看看他们在压力下的表现所以,我们对数字不感兴趣,而是两个版本之间的差异。”测试结果表明,HasuraStorage在每种情况下都能够处理请求数量的巨大增长,较小的文件(5x)具有更明显的效果。还设法在所有情况下显着改善RAM消耗,尤其是在下载大文件时。值得一提的是,这是在服务多达5倍的请求的前提下。HasuraStorage提供了两个数字:MinimumResponseTime,开源告诉我们系统在没有压力的情况下会响应多长时间;和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表示,他们决定重写该服务以提高性能指标;在对这两种服务进行并排基准测试后,他们还可以自信地声称他们设法显着改善了所有指标。“我们希望能够在使用更少资源的同时满足更多请求,同时还可以缩短用户的响应时间,我相信他们会喜欢的。”
