1 如何用Go重写Node.js服务-德赢Vwin官网 网
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运维】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静

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

    关注

    68

    文章

    10854

    浏览量

    211568
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1368

    浏览量

    114639
  • 开源
    +关注

    关注

    3

    文章

    3309

    浏览量

    42471
  • 存储服务
    +关注

    关注

    0

    文章

    20

    浏览量

    5943

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

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

收藏 人收藏

    评论

    相关推荐

    使用OpenVINO™ ElectronJS中创建桌面应用程序

      最近,我完成了一个 demo 演示,展示了 OpenVINO 在 Node.js 框架中的强大功能。得益于与 Electron.js 的集成,该演示不仅能够高效地执行神经网络推理,还提供了交互式
    的头像 发表于 11-25 11:35 157次阅读
    使用OpenVINO™ ElectronJS中创建桌面应用程序

    Node.js小科普和Node.js安装常见管理工具

    便捷。但是随着JavaScript影响力不断壮大,它的使用范围已经发生了变化。2009年,Node.js发布,初代版本支持基本的网络通信和文件系统操作,这让JavaScript可以到服务器上大展拳脚
    的头像 发表于 11-23 15:37 101次阅读
    <b class='flag-5'>Node.js</b>小科普和<b class='flag-5'>Node.js</b>安装常见管理工具

    前端技术探秘-Nodejs的CommonJS规范实现原理

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

    JS实现简单的屏幕录像机

    作者:京东保险 张洁 本文将介绍如何用JS实现简单的屏幕录像机。 一、录制准备 创建一个按钮   Start recording   书写JavaScript   var
    的头像 发表于 10-09 15:27 147次阅读

    工程师必备!Node.js和常见管理工具介绍(附操作演示)

    语言及其相关生态中的一些基础而关键的概念,以及它们是如何在互联网历史浪潮中产生的。一JavaScript与Node.js1JavaScriptJavaScript,即JS
    的头像 发表于 08-30 12:34 300次阅读
    工程师必备!<b class='flag-5'>Node.js</b>和常见管理工具介绍(附操作演示)

    ARMxy ARM 物联网边缘计算网关支持 Node-RED 用于工业控制

    在恶劣环境下稳定运行。丰富的通信接口(如网口、USB、RS485 等)及 WiFi/4G 支持,使网关能够灵活适应不同网络环境。 Node-RED 是一个基于 Node.js 的流程编排工具,通过
    的头像 发表于 08-19 17:01 359次阅读
    ARMxy ARM 物联网边缘计算网关支持 <b class='flag-5'>Node</b>-RED 用于工业控制

    使用api调用espconn_connect时遇到的疑问求解

    当我们使用 api 调用时espconn_connect我们会遇到问题。 我们想在我们的私人服务器下模拟node.js的 socket.io(websocket),但是我们没有机会,也没有足够
    发表于 07-11 07:20

    Node-RED如何制作漂亮的界面

    Node-RED不仅是一个强大的编程工具,还能通过其仪表盘(Dashboard)功能为物联网应用创建美观、实用的界面。以下是如何使用Node-RED制作漂亮界面的详细步骤和技巧。很多公司已经将产品
    的头像 发表于 06-26 16:50 4534次阅读
    <b class='flag-5'>Node</b>-RED如何制作漂亮的界面

    Node-RED安装本地教程

    Node-RED是一个基于流的开发工具,广泛应用于物联网(IoT)、家庭自动化和其他数据驱动的应用程序。它通过图形化的编程界面,使得非专业程序员也能轻松上手。本文将介绍如何在本地环境中安装Node-RED,帮助你快速开始项目开发。
    的头像 发表于 06-24 12:10 2050次阅读
    <b class='flag-5'>Node</b>-RED安装本地教程

    鸿蒙实战开发-本地部署、SmartPerf 编译部署指导文档

    编译环境搭建 注意:在linux编译环境安装时以root或者其他 sudo 用户身份运行下面的命令。 node 环境安装 下载Node js安装包(windows推荐, linux跳过此步骤) 从
    发表于 05-09 14:23

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

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

    鸿蒙新手入门-环境准备问题解析

    Node.js版本与API配套关系 由于SDK的部分工具依赖Node.js运行时,推荐使用配套API版本的Node.js,保证工程的兼容性。 匹配关系见下表: API Level Node.j
    发表于 02-18 17:44

    鸿蒙 Harmony 工具篇

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

    鸿蒙OpenHarmony NAPI技术-基础学习

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

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

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