0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用Go重写Node.js服务

马哥Linux运维 来源:OSC开源社区 作者:OSC开源社区 2022-07-01 10:51 次阅读

Hasura Storage 是一项开源服务,在 hasura 和任何 s3 兼容的存储服务之上增加了一个存储服务。其目的是能够利用云存储服务,同时也利用 hasura 的功能,如它的 graphql API、权限、行动、预设等。

出于业务发展需求,Hasura Storage 团队近期将其原本用 Node.js 编写的服务用 Golang 进行了重写。“这个用 Node.js 编写的服务在相当长的一段时间内为我们提供了良好的服务,但随着公司的发展和用户数量的大规模增加,性能开始成为一个问题。虽然 Node.js 可能有很多可取之处,但优异的性能和可扩展性并不是其中之一。”

Hasura Storage 方面表示,在使用Golang进行重写后,其可处理的服务请求数增加了 5 倍,同时内存消耗减半。根据介绍,他们选择 Go 的原因在于:

该语言的依赖性管理系统和构建系统使其非常适合云

团队有丰富的 Golang 经验

虽然 Go是一种非常冗长的语言(尤其是与 Node.js 相比),但它非常易于学习且编写速度快

性能非常优异

重写完成后,Hasura Storage 团队针对 Node.js 和 Golang 版本的服务运行了一些基准测试。使用了k6并设计了以下测试:

当测试开始时,它会在前 10 秒内将 workers 的数量从 1 增加到 TARGET

然后再运行 60 秒才结束。

Workers尽可能快地查询服务

运行以下测试:

download_small_file

download_medium_file

download_large_file

download_image

download_image_manipulated

CPU 被限制在整个系统的 10%

RAM 是无限的

Hasura Storage 提前声明称,最终结果不应该只看表面的数字;“用于基准测试的系统的 CPU 容量非常有限,因为我们想对这两种服务施加压力并看看它们在压力下的表现如何所以,我们感兴趣的不是数字,而是两个版本之间的差异。”

测试结果表明,Hasura Storage在每种情况下能够处理的请求数都实现了大幅提升,其中较小的文件(5x)的效果更为显著。

522bd990-e2dd-11ec-ba43-dac502259ad0.png

同时在所有情况下都设法大大改善了 RAM 消耗,尤其是在下载大文件时。值得一提的是,这还是在提供了多达 5 倍的请求的前提下。

529817c2-e2dd-11ec-ba43-dac502259ad0.png

另一个重要的指标是响应时间,Hasura Storage 提供了两个数据:最小响应时间,开源告诉我们系统未承受压力时的响应时间;以及 P95,开源告诉我们大多数用户的响应时间最多是多少(包括当系统处于压力之下)。

首先是最小响应时间。测试用例download_small_file 的结果不好从图中目测,但Hasura Storage 称其将场景的响应时间从 Node.js用例的 29ms 提高到 Golang用例的 7ms。除了在 download_image_manipulated 中实现了大约 2 倍的改进外,在其他场景中则均实现了 4 倍的改进。

52ffaa72-e2dd-11ec-ba43-dac502259ad0.png

再是 P95。除 download_image_manipulated 和 download_large_file 外,大多数情况下都实现了 4 倍的改进。Hasura Storage 解释称,虽然没有像其他情况那样戏剧性,但这两种情况下都有实质性的改进。“这是合理的,因为下载大文件会受到 I/O NET 的约束,而处理图像则会受到 CPU 的约束。但即使如此,我们也很高兴看到这种实质性的改进。”

534e3a52-e2dd-11ec-ba43-dac502259ad0.png

此外,图像处理方面也有所改善。

在服务被重写和测试后,Hasura Storage 将服务部署到了生产环境,一些重写的好处也开始展现。如下图所示(集群的一个节点中的 RAM 使用情况),内存占用减少了近 40%。“这是一项重大改进,可以让我们在不增加整体基础设施费用的情况下为更多用户和流量提供服务。”

53dbe7c6-e2dd-11ec-ba43-dac502259ad0.png

Hasura Storage 方面表示,他们决定重写服务是为了提高性能指标;而在对两个服务进行并列基准测试后,他们也可以有底气的宣称成功地显着改善了所有指标。“我们希望能够在使用更少资源的同时满足更多请求,同时还可以改善我们用户的响应时间,我相信他们会喜欢的。”

原文标题:用Go重写Node.js服务:项目性能提升5倍,内存减少40%

文章出处:【微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10442

    浏览量

    206545
  • RAM
    RAM
    +关注

    关注

    7

    文章

    1321

    浏览量

    113705
  • 开源
    +关注

    关注

    3

    文章

    2985

    浏览量

    41716
  • 存储服务
    +关注

    关注

    0

    文章

    19

    浏览量

    5919

原文标题:用Go重写Node.js服务:项目性能提升5倍,内存减少40%

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    鸿蒙开发实战:网络请求库【axios】

    [Axios] ,是一个基于 promise 的网络请求库,可以运行 node.js 和浏览器中。本库基于[Axios]原库v1.3.4版本进行适配,使其可以运行在 OpenHarmony,并沿用其现有用法和特性。
    的头像 发表于 03-25 16:47 817次阅读
    鸿蒙开发实战:网络请求库【axios】

    鸿蒙 Harmony 工具篇

    平台做的自定义 IDE。因此,对于 Java 开发者而言,DevEco 只是“在熟悉中带有一点点陌生”。 安装 Node.js 在安装好 DevEco 之后,首次点开需要开发者设置 Node.js
    的头像 发表于 01-30 15:00 359次阅读
    鸿蒙 Harmony 工具篇

    鸿蒙OpenHarmony NAPI技术-基础学习

    NAPI(Native API)是OpenHarmony系统中的一套原生模块扩展开发框架,它基于Node.js N-API规范开发,为开发者提供了JavaScript与C/C++模块之间相互调用的交互能力。可以在NodeJs官网查看各种NAPI接口定义说明。
    的头像 发表于 01-19 16:57 333次阅读
    鸿蒙OpenHarmony NAPI技术-基础学习

    N-API的JS堆对象生命周期管理

    N-API是Node API的简写,同时也是nodejs的JS VM(链)接入原生模块.node文件的应用程序二进制接口(i.e. ABI)。借助N-API引入的抽象隔离,升级nodejs运行时(虚拟机)
    的头像 发表于 12-29 09:41 217次阅读
    N-API的<b class='flag-5'>JS</b>堆对象生命周期管理

    javascript运行环境有哪些

    使用 SpiderMonkey 引擎,而 Safari 使用 JavaScriptCore 引擎等。 Node.jsNode.js 是基于 Chrome V8 引擎的 JavaScript 运行环境。它允许在服务
    的头像 发表于 11-27 16:11 1221次阅读

    Nodejs的CommonJS规范实现原理

    Node.js 是一个基于 ChromeV8 引擎的 JavaScript 运行环境,使用了一个事件驱动、非阻塞式 I/O 模型,让 JavaScript 运行在服务端的开发平台
    的头像 发表于 11-25 10:21 266次阅读
    Nodejs的CommonJS规范实现原理

    SpringBoot物理线程、虚拟线程、Webflux性能比较

    大量的文章评估了一系列技术(包括 Node.js、Deno、Bun、Rust、Go、Spring、Python 等)在简单的“hello world”场景中的性能。虽然这些文章获得了好评,但有一个共同点:忽略了现实场景开发中的复杂性 。
    的头像 发表于 10-23 14:31 320次阅读
    SpringBoot物理线程、虚拟线程、Webflux性能比较

    Nginx常用配置与命令

    对于前端来说 Node.js 并不陌生, Nginx 和 Node.js 的很多理念类似, HTTP 服务器、事件驱动、异步非阻塞等,且 Nginx 的大部分功能使用 Node.js
    发表于 10-18 10:04 160次阅读
    Nginx常用配置与命令

    38.14.05.Microsoft Azure 中文入门教学 - 应用程序服务 - 部署 Node.js

    服务代码应用程序
    充八万
    发布于 :2023年07月13日 10:18:21

    37.14.04.Microsoft Azure 中文入门教学 - 应用程序服务 - 建立 Node.js

    服务代码应用程序
    充八万
    发布于 :2023年07月13日 10:17:11

    不同语言运行100万个并发任务需要多少内存?

    在这篇博客文章中,我深入探讨了异步和多线程编程在内存消耗方面的比较,跨足了如Rust、Go、Java、C#、Python、Node.js 和 Elixir等流行语言。
    的头像 发表于 07-12 14:14 354次阅读
    不同语言运行100万个并发任务需要多少内存?

    英特尔Edison Node JS物联网报警系统

    电子发烧友网站提供《英特尔Edison Node JS物联网报警系统.zip》资料免费下载
    发表于 06-13 17:08 0次下载
    英特尔Edison <b class='flag-5'>Node</b> <b class='flag-5'>JS</b>物联网报警系统

    Linux哪吒D1的NodeRed机械臂控制与拍照(二)

    以下是使用node-red实现的本项目各项重要功能,关于node-red的安全可以自己参考网上的安装教程,一般要先安装node.js,安装好之后才能正常调用npm功能安装node-re
    的头像 发表于 05-17 09:02 2863次阅读

    node.js实战源码

    node.js实战源码
    发表于 05-16 18:06 0次下载

    为什么Dubbo这么老的项目还要用Go重写

    Dubbo 诞生于阿里巴巴,2011年开源的Dubbo已经走过了10个年头。在2019年,它被用Go重写并开源,如今两年过去,已经从当初的V1.0.0版本发展到了V3.0.0,截止目前star数3.8K。
    发表于 05-08 09:02 249次阅读
    为什么Dubbo这么老的项目还要用<b class='flag-5'>Go</b><b class='flag-5'>重写</b>?