文章详情 PayPal 为什么从 Java 迁移到 Node.js:性能提高一倍,文件代码减少44%

简介: 大家都知道 PayPal 是另一家迁移到 Node.js 平台的大型公司,Jeff Harrell 的这篇博文 Node.js at PayPal 解释了为什么从Java迁移出来的原因:开发效率提高一倍(2个人用更少的时间干了5个人的活),性能提高一倍,代码量减少33%, 文件减少40%。

大家都知道 PayPal 是另一家迁移到 Node.js 平台的大型公司,Jeff Harrell 的这篇博文 Node.js at PayPal 解释了为什么从Java迁移出来的原因:开发效率提高一倍(2个人用更少的时间干了5个人的活),性能提高一倍,代码量减少33%, 文件减少40%。


(小编:个人认为深层次原因是 Java 正在越来越走向封闭,而且变得越来越复杂而且 oracle 正在对 Java 收费,参见:Oracle 计划发布收费版 JVM,这促使了越来越多的公司加入了去Java化的队伍)


外面有很多人说PayPal正在迁移到node.js平台。我很高兴地在这里宣布,传言是真的,我们正在从Java迁移至node.js。


由于历史原因,我们的工程师一直分为两拨人,一拨在浏览器上写代码(HTML,CSS,JavaScript);另一拨用 Java 写应用层的代码。想象一下,一个写 HTML 的不得不去叫一个写 Java 将 A/B 两个页面链接到一起吗?我们正在这样干,我们称这样的人为全端工程师,那些即可以设计精美界面和服务器后台的那些人。现在前后端已经没有界限了,这曾经是阻碍PayPal发现的一个很大的瓶颈。


Node.js 帮助我们将前、后端合二为一,现在我们一个全端团队即可解决用户的所有问题。


早期采纳

像其他人一样,我们刚开始使用 node.js 做了一些 demo 用的原型程序。跟很多人一样,她表现出来的超高性能,让我们最终决定把她放到线上去。


我们最初使用 express 来路由请求,nconf 用来配置,grunt 用来创建 tasks。Express 非常普及,但是我们发现 Express 在多个团队协作时表现出的可伸缩性不足,它并不适合所有场合。Expres 非常灵活,但在大型团队开发上的可扩展性不佳。最终我们的队员基于原生的node.js,并创建了Karken.js;她并不是一个框架,更像是一个规范,但相对于 express,她更适合大型团队的扩展。我们希望我们的工程师专注他们的应用,而不是专注他们的运行环境。


我们已经在内部使用 kraken.js 好几个月了(我们马上会把他开源的!)我们的工程师非常渴望这个内部框架能尽快上线。


(小编:预测 karken.js 即将是,另一个超火的后端框架,火热程度参考 twitter 的 bootstrap )


将 node.js 布署到线上

我们第一个采用 nodejs 的产品不是一个小的应用;是我们的浏览量最多的用户首页。我们希望步子迈得大一点,但是我们清楚知道其中的风险,所以我们同时还并行地运行了一个 Java 的程序。我们在开发和扩展 Java 方面非常有经验。所以一旦 node.js 应用出问题了,我们可以立即切回 Java。不过,同时我们也发现了一些非常有意思的数据。


开发

从1月份开始,我们花了几个月的时间来搭建 node.js 的基础设施。比如:sessions(会话),centralized logging(集中日志),keystores(存储)。在这期间我们有5位 Java 工程师在开发 Java。在开发了两个月后,两位工程师开始开发 node.js 应用。在6月初两个团队的开发进度已经一样了,两者的功能完全一样。开发 node.js 应用的那个小团队,尽管推迟了两个月,但是很快赶上了。这里我们对这些相同功能做的一些单元测试得出的结果:


Node.js的是:

更少的人开发的 node.js 应用比 Java 的快一倍;

节省了33%的代码量;

少了40的文件;

(小编,这里作者的意思并不是 Java 程序员的素质没有 node.js 的好,Java 语言的特点决定她需要更多的人,更多的时间,更多的代码去完成在 node.js 下的同样的工作,并且吃力不讨好。参考:他们为什么说面向对象有问题,探讨面向对象的一些缺陷 ;性能测评:Node.JS 比 Java EE 快 20%


这是一个非常鼓舞人的证据,我们似乎应该更快地迁移到 JavaScript 平台上去。我们立即做了一个决定,暂停 Java 应用的开发,全心全意开发 JavaScript 应用。这对开发 Java 项目的工程师来说是个好消息,他们已经消除了对 node.js 的疑虑,非常高兴地投入到了并行的 node.js开发上来,这样我们的开发效率提高了两倍。


性能

性能是一个非常有意思和具有争议性的话题。在我们这,我们有两个平台实现完全一样功能的程序;一个是使用基于 Spring 的内部 Java 框架;另一个是基于 kraken.js,express,dust.js 和其他开源框架。 这些程序包含三个 API,每个 API 来响应 2 到 5 个请求,由Dust 来模拟获取数据和显示页面。


我们用线上的环境去测试这两个应用,并收集了完成响应的时间和请求数。


node.js vs Java 性能对比

在这张图上你可以看到 node.js 应用的优势:

image.png

每秒请求数量是Java的两倍。不过更有意思的是我们仅使用了单核的node去跟5核的Java来对比,我们非常希望将来继承扩大 node.js 的优势。

渲染相同的页面,node.js 节省了35%的时间。即每个页面节约了 200 豪秒,用户可以清楚地感觉到这样的区别。


未来

我们将继续使用 node.js 来构建我们的Web应用。像我们正在开发的那些门户,和已经上线的用户概览页面。还有一打正在进入 Beta 测试的那些工程,我们会继续分享我们在上线过程中的经验,数据。对于 PayPal 来说这是一个另人激动的时刻。

相关文章
|
4月前
|
存储 缓存 Java
Java 12相比Java 11有哪些性能上的提升?
Java 12相比Java 11有哪些性能上的提升?
148 3
|
4月前
|
Java 测试技术 API
Java Stream API:被低估的性能陷阱与优化技巧
Java Stream API:被低估的性能陷阱与优化技巧
420 114
|
4月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
235 1
|
4月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
288 8
|
5月前
|
Java Spring
如何优化Java异步任务的性能?
本文介绍了Java中四种异步任务实现方式:基础Thread、线程池、CompletableFuture及虚拟线程。涵盖多场景代码示例,展示从简单异步到复杂流程编排的演进,适用于不同版本与业务需求,助你掌握高效并发编程实践。(239字)
313 6
|
5月前
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
|
5月前
|
缓存 Java 开发者
Java 开发者必看!ArrayList 和 LinkedList 的性能厮杀:选错一次,代码慢成蜗牛
本文深入解析了 Java 中 ArrayList 和 LinkedList 的性能差异,揭示了它们在不同操作下的表现。通过对比随机访问、插入、删除等操作的效率,指出 ArrayList 在多数场景下更高效,而 LinkedList 仅在特定情况下表现优异。文章强调选择合适容器对程序性能的重要性,并提供了实用的选择法则。
301 3
|
6月前
|
机器学习/深度学习 Java 编译器
解锁硬件潜能:Java向量化计算,性能飙升W倍!
编译优化中的机器相关优化主要包括指令选择、寄存器分配、窥孔优化等,发生在编译后端,需考虑目标平台的指令集、寄存器、SIMD支持等硬件特性。向量化计算利用SIMD技术,实现数据级并行,大幅提升性能,尤其适用于图像处理、机器学习等领域。Java通过自动向量化和显式向量API(JDK 22标准)支持该技术。
293 4
|
6月前
|
Cloud Native 前端开发 Java
WebAssembly 与 Java 结合的跨语言协作方案及性能提升策略研究
本文深入探讨了WebAssembly与Java的结合方式,介绍了编译Java为Wasm模块、在Java中运行Wasm、云原生集成等技术方案,并通过金融分析系统的应用实例展示了其高性能、低延迟、跨平台等优势。结合TeaVM、JWebAssembly、GraalVM、Wasmer Java等工具,帮助开发者提升应用性能与开发效率,适用于Web前端、服务器端及边缘计算等场景。
252 0
|
7月前
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
209 0