Npam的指数级增长促使npm工程团队从Node.js切换到Rust,以处理那些将成为性能瓶颈的CPU绑定任务。最近的一份白皮书概述了在Rust中开发这个新服务,以及将其投入生产一年多的经验。

大部分npm操作是流量密集型的,Node.js正是针对这种场景设计的。但是,npm工程师们发现,确保只有授权用户可以发布包的授权服务显示出令人担心的计算密集型负载。Npm工程师Chris Dickinson解释到,因为身份验证服务有点过时了,所以做出从头开始重写它的决定并不难。因此,npm工程师开始寻找最适合该任务的编程语言。因为缺乏内存安全性,C和C++很快就被排除在外,而Java因为依赖虚拟机,也出局了。剩下的语言有两种,分别是Go和Rust。为了更好地评估最终解决方案,npm团队决定用这两种语言以及Node.js分别重写他们的身份验证服务,以便进行比较。

不可否认,npm的身份验证服务没那么复杂,以Node.js重写只花了一个小时。另一方面,Go需要2天,但以Rust重写花了整整一个星期,主要是因为Rust的学习曲线更加陡峭以及该语言的内在复杂性,Chris Dickinson这样解释说。

我们将编写一个正确的程序,但是,我们必须思考该正确程序的方方面面。

最后,npm团队决定部署Rust版本的身份验证服务,这主要归功于他们获得来自Rust社区的强力支持,以及与当时Go能提供的包管理器相比,Rust包管理器Cargo具有优势。

对npm团队来说,好消息是Rust服务已经在生产环境中运行一年有余,没有任何告警。这与在npm部署Node.js服务的常规经验形成鲜明对比,为让错误和资源的使用可控,在npm部署Node.js要包括大量的监控。消极的一面是,根据Chris Dickinson的说法,在npm引入Rust的最大缺点就是不得不处理另外的栈,包括监控和日志记录。

阅读英文原文:NPM Adopted Rust to Remove Performance Bottlenecks

NPM采用Rust以消除性能瓶颈的更多相关文章

  1. 使用rust调用c++静态库并编译nodejs包

    在项目上经常要用到身份证阅读器.护照阅读仪.指纹仪等各种品牌硬件,假如每套系统的都做集成开发那代码的维护成本将变得很高,为此采用rust来调用厂家提供的sdk c++开发包并封装成nodejs包,用f ...

  2. 消除JavaScript闭包的一般方法

    JavaScript 的闭包是一个其主动发展的特性, 也是一个被动发展的特性. 也就是说, 一方面, JS 有了闭包能更好解决一些问题. 另一方面, JS 为了解决某些问题, 而不得不使用闭包勉强来解 ...

  3. npm包使用语义化版本号

    npm 采用语义版本管理软件包.所谓语义版本,就是指版本号为a.b.c的形式,其中a是大版本号,b是小版本号,c是补丁号. 一个软件发布的时候,默认就是1.0.0版.如果以后发布补丁,就增加最后一位数 ...

  4. npm的packagejson文件

    一.name,npm包名name和version字段是package.json文件中最重要的字段,都是必须的字段,如果你的npm包没有指定这两个字段,将无法被安装.name和version字段被假定组 ...

  5. T4:使用 T4 消除程序和配置文件中重复的字符串信息

    背景 我们经常在配置文件中配置各种:id.name,然后在程序中使用这些配置获取信息,这导致了字符串重复出现在系统的多个地方,非常不利于维护,本文介绍采用 T4 来消除这种重复. T4 消除重复 配置 ...

  6. nodejs进阶(1)——npm使用技巧和最佳实践

    nodejs进阶教程,小白绕道!!! npm使用技巧和最佳实践 前提:请确保安装了node.js npm的最佳实践 npm install是最常见的npm cli命令,但是它还有更多能力!接下来你会了 ...

  7. npm版本管理 命令

    npm采用了semver规范作为依赖版本管理方案.semver 约定一个包的版本号必须包含3个数字 MAJOR.MINOR.PATCH 意思是 主版本号.小版本号.修订版本号 MAJOR 对应大的版本 ...

  8. Rust 优劣势: v.s. C++ / v.s. Go(持续更新)

    Rust 发展速度比 C++ 强很多.如果去翻 open-std 的故纸堆,会发现 C++ 这边有很多人(包括标准委员会的人)提了有用的提案,但后来大多不了了之或经历了非常长的时间才进入标准. > ...

  9. npm基本用法及原理(10000+)

       作为前端开发者,应该每个人都用过npm,那么npm到底是什么东西呢?npm run,npm install的时候发生了哪些事情呢?下面做详细说明. 1.npm是什么 npm是JavaScript ...

随机推荐

  1. eclipse项目导入和导出

    导入导出过程这里推荐一下一篇他人的文章: https://blog.csdn.net/qq_41937388/article/details/87073572 注意: 1.导入第3步中,如果你的项目已 ...

  2. gitlab问题

    1.gitclone前http://10.10.11.4:9999/SZRDC/I`````````.git改为http://git.berchina.com:9999/~~~~``` 2.Cloni ...

  3. 【原创】Linux RCU原理剖析(一)-初窥门径

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  4. Shell:Day03笔记

    编程原理:1.编程结束  驱动 硬件默认是不能使用的   CPU控制硬件   不同的厂家硬件设备之间需要进行指令沟通,就需要驱动程序来进行“翻译”    编程语言的分类:  高级语言.超高级语言需要翻 ...

  5. 最近准备研读thinkphp源码,ctag派上用场了

    本人习惯用vim编辑器,这里ctags配置vim很方便. #在ThinkPHP源码目录(假定为/server/thinkphp)执行: $ cd /server/thinkphp $ ctags -R ...

  6. web日志分析的重要性

    虽然不可能对庞大的日志文件进行逐条的阅读,但是在这些日志文件中,确实会包含一些非常重要的信息.例如,在什么时间.有哪些ip地址访问了网站中的什么资源,等等. 通过对日志文件的分析,可以获得如下信息. ...

  7. yii2框架学习笔记

    1.去掉yii2模版默认的头部和脚部的两种方法: (1) 第一种 $this->layout = false; $this->render('index'); (2) 第二种(partia ...

  8. readthedocs网托管持多语言文档

    希望在readthedocs上创建支持多语言的文档,效果类似: 通过语言选项,可以切到到不同的语言版本:实现这个目标包含两个主要步骤: 在本地对文档进行翻译 在readthedocs.org上配置翻译 ...

  9. Vulnhub DC-6靶机渗透

    信息搜集 nmap -sP 192.168.146.0/24 #找靶机ip nmap -sS -Pn -A 192.168.146.143 #扫描靶机信息 22和80端口,老朋友了. 先直接访问htt ...

  10. 分治算法(C++版)

    #include<iostream>using namespace std;  void printArray(int array[],int length)  {      for (i ...