NPM采用Rust以消除性能瓶颈
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以消除性能瓶颈的更多相关文章
- 使用rust调用c++静态库并编译nodejs包
在项目上经常要用到身份证阅读器.护照阅读仪.指纹仪等各种品牌硬件,假如每套系统的都做集成开发那代码的维护成本将变得很高,为此采用rust来调用厂家提供的sdk c++开发包并封装成nodejs包,用f ...
- 消除JavaScript闭包的一般方法
JavaScript 的闭包是一个其主动发展的特性, 也是一个被动发展的特性. 也就是说, 一方面, JS 有了闭包能更好解决一些问题. 另一方面, JS 为了解决某些问题, 而不得不使用闭包勉强来解 ...
- npm包使用语义化版本号
npm 采用语义版本管理软件包.所谓语义版本,就是指版本号为a.b.c的形式,其中a是大版本号,b是小版本号,c是补丁号. 一个软件发布的时候,默认就是1.0.0版.如果以后发布补丁,就增加最后一位数 ...
- npm的packagejson文件
一.name,npm包名name和version字段是package.json文件中最重要的字段,都是必须的字段,如果你的npm包没有指定这两个字段,将无法被安装.name和version字段被假定组 ...
- T4:使用 T4 消除程序和配置文件中重复的字符串信息
背景 我们经常在配置文件中配置各种:id.name,然后在程序中使用这些配置获取信息,这导致了字符串重复出现在系统的多个地方,非常不利于维护,本文介绍采用 T4 来消除这种重复. T4 消除重复 配置 ...
- nodejs进阶(1)——npm使用技巧和最佳实践
nodejs进阶教程,小白绕道!!! npm使用技巧和最佳实践 前提:请确保安装了node.js npm的最佳实践 npm install是最常见的npm cli命令,但是它还有更多能力!接下来你会了 ...
- npm版本管理 命令
npm采用了semver规范作为依赖版本管理方案.semver 约定一个包的版本号必须包含3个数字 MAJOR.MINOR.PATCH 意思是 主版本号.小版本号.修订版本号 MAJOR 对应大的版本 ...
- Rust 优劣势: v.s. C++ / v.s. Go(持续更新)
Rust 发展速度比 C++ 强很多.如果去翻 open-std 的故纸堆,会发现 C++ 这边有很多人(包括标准委员会的人)提了有用的提案,但后来大多不了了之或经历了非常长的时间才进入标准. > ...
- npm基本用法及原理(10000+)
作为前端开发者,应该每个人都用过npm,那么npm到底是什么东西呢?npm run,npm install的时候发生了哪些事情呢?下面做详细说明. 1.npm是什么 npm是JavaScript ...
随机推荐
- 编译安装inotify-tools和监控inotifywait事件
编译安装inotify-tools软件包 1)解包inotify-tools-3.13.tar.gz文件 [root@svr7~]#ls inotify-tools- ...
- window部署ftp服务器
...
- python--Django(后台管理模块)
一.准备工作 1.创建应用 python manage.py startapp test 2.定义模型类 (1)打开刚创建的app目录test,打开models.py文件 (2)代码如下 from d ...
- 汇编刷题:屏幕显示 HOW ARE YOU!
DATA SEGMENT INFO DB 'HOW ARE YOU!$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DAT ...
- 28.1 api-- Object(toString equals)
/* * String toString() : 返回该对象的字符串表示 * return getClass().getName() + "@" + Integer.toHexSt ...
- matplotlib中的基本概念
有外语基础的朋友看这里: matplotlib官方文档 Figure(图像): 组成部分
- web.xml配置参数context-param和init-param的区别
web.xml配置参数context-param和init-param的区别 (2009-04-13 10:29:01) 转载▼ 标签: 杂谈 分类: JavaEE web.xml里面可以定义两种参数 ...
- windows powershell校验下载的文件MD5和SHA1值
Windows自带MD5 SHA1 SHA256命令行工具 certutil -hashfile <文件名> <hash类型> 打开windows powershell,进入到 ...
- 在IDEA中搭建Java源码学习环境并上传到GitHub上
打开IDEA新建一个项目 创建一个最简单的Java项目即可 在项目命名填写该项目的名称,我这里写的项目名为Java_Source_Study 点击Finished,然后在项目的src目录下新建源码文件 ...
- 收集免费的接口服务,做一个api的搬运工
hello, 大家好,今天给大家推荐的开源项目在某种程度上极大的方便了广大的开发者,这个开源项目统计了网上诸多的免费API,为广大开发者收集免费的接口服务,专心致志做一个API的搬运工,每月定时更新新 ...