NPM采用Rust以消除性能瓶颈

作者:Sergio De Simone

2019 年 3 月 19 日

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


2019 年 3 月 19 日 00:0010386
用户头像

发布了 199 篇内容, 共 64.9 次阅读, 收获喜欢 270 次。

关注

评论 2 条评论

发布
用户头像
nodejs稳定性成疑,开发效率不错,WYSWYG,client端的确非常合适。
rust开发效率这么看来非常堪忧啊,稳定性的确赞——可以取代ADA么?毕竟波音PHP都能用。
java暂时中庸,在服务器端是霸主地位啊。
2019 年 03 月 21 日 10:44
回复
用户头像
似乎没有比较 go 和 rust 的性能,毕竟rust的开发耗时远高于go
2019 年 03 月 19 日 23:10
回复
没有更多评论了
发现更多内容

ARTS打卡-07

Geek_yansheng25

架构师训练营 - 第 6 周学习总结

红了哟

CECBC区块链专委会副主任吴桐受邀成为伏羲智库兼职研究员

CECBC区块链专委会

区块链技术 吴桐 商务部CECBC 伏羲智库 政务链

从推特被黑看安全木桶效应

石君

安全设计 安全事件

我关闭了微信朋友圈广告!

诸葛小猿

广告 微信朋友圈 关闭

Windows Sandbox

Dare Devor

Sandbox Virtualization

第七章作业

小胖子

运行 client-go 测试用例.md

FeiLong

Kubernetes

关于性能优化的总结

罗亮

LeetCode 题解:1051. 高度检查器,JavaScript,先排序再比较,详细注释

Lee Chen

LeetCode 前端进阶训练营

看动画学算法之:排序-归并排序

程序那些事

Java 算法 排序 归并排序

Go: 通过例子学习 Map 的设计 — Part I

陈思敏捷

go golang map

道德的神

多选参数

故事

架构师课程第七周 作业

杉松壁

架构师训练营 - 第 6 周命题作业

红了哟

redis系列之——事物及乐观锁

诸葛小猿

redis 乐观锁 事物 原子性 隔离性

架构师训练营第七周学习总结

张明森

架构师训练营第七周作业

张明森

Java中生成随机数的不同方法

wjchenge

多问为什么

声远

技术 沟通 软件开发流程

谈谈你是如何理解JS异步编程的,EventLoop、消息队列都是做什么 ,什么是宏任务,什么是微任务?

GKNick

生活不止眼前的代码,老程序员现摘现炒苦瓜吃苦的周末时光

陆陆通通

程序员 美食 舌尖 程序员生活

Prometheus 删除指定 Metric

耳东

Prometheus metrics

解决火狐新窗口打开网页被拦截问题

Lee Chen

前端进阶训练营

可读代码编写炸鸡八 - 变量兜兜转转像是一场梦

多选参数

代码 代码组织 代码规范 可读代码编写 可读代码

盘点本周区块链国内大事件

CECBC区块链专委会

web 性能压测工具类

jason

思想无语言边界:以cglib介绍AOP在java的一个实现方式

八苦-瞿昙

随笔 随笔杂谈 aop

Golang实现结构体数组按多字段排序

卓丁

多字段排序 结构体多字段排序 golang多字段排序

计算机网络基础(六)---网络层-网络地址转换NAT技术

书旅

laravel 计算机网络 网络协议 计算机基础 NAT

Vagrant 创建多台主机

FeiLong

vagrant 虚拟机

NPM采用Rust以消除性能瓶颈-InfoQ