看eBay如何评价他们的Node.js首次尝鲜

据eBay官方技术博客介绍,一直以来他们依赖的都是基于Java的技术,所有的工作流都围绕着Java和JVM。考虑到ebay.com这样的流量规模和稳定性要求,使用Java这样可靠的技术明显是合适的选择。在这篇文章中,作者介绍了eBay为何以及如何开发了他们第一个Node.js应用。以下为CSDN编译。

扩展性

这一切起源于eBay Hackathon冠军项目产品化的想法,但是我们发现Java并不适合该项目(并无恶意),于是开始了Node.js世界的探索之路。

关于这个项目我们有两项基本要求:第一,尽可能地实时响应——比如维持与服务器端的实时连接;第二,能够集成eBay数量众多的独有服务,在页面上显示信息——比如绑定I/O相关操作。我们起初使用的是基础Java结构,但是它对资源的消耗大大出乎我们的预期,在产品化时遇到了扩展性问题。这促使我们决心构建一个新的 orchestrator中间件,而Node.js最符合我们的需求。

心态

eBay一直以来都围绕Java这样的强类型静态语言开发解决方案,所以一开始很难说服大家使用JavaScript做后端开发。类型安全保障、错误处理、扩展等等方向的问题都困扰着我们。此外JavaScript本身(被称为 世界上误解最多的语言)也让这场辩论变得更加艰难。为此,我们建立了一个专门的内部wiki来聚合工程师们对于Node.js的观点、疑惑、问题等等。

几天后我们明确了大家的问题,开始着手解答。不出所料,关注最多的还是在于Node.js技术的可靠性,以及Node.js在处理早期eBay独有的函数式Java实现的效率上。

我们一一解答了这些问题,并且提供了详细现实案例。这一过程让大家,包括我们自己在内都深受启发,有的问题提出的角度是甚至我们从未想过的,最终大家终于理解了Node.js的核心价值。事实上,其中一些反对观点恰恰是其特色之处。

启动

项目从零开始,我们的目标是建立一个最小化的 boilerplateNode.js服务器,但是必须拥有足够的可扩展性;此外我们并不想引入现有的框架,因为这会使应用变得臃肿。随后我们依次引入了4个Node模块——express、cluster、request以及async。数据持久性方面,我们决定采用和eBay一样MongoDB,这就不会增加使用的难度。通过这些基本设置,项目服务已经可以运行了。服务器能够接收请求、调用eBay API,并持久化一些数据。

对于端到端的测试,我们将前端服务器指向Node.js服务器,一切看起来都不错。但接下来才是更严峻的挑战,我们开始使用白板描述所有用例、敲定REST结束点、设计数据模型和结果、确定最合适的Node模块,最后实现每个端点。在接下来的几周里,我们一直在编码、编码、编码……

部署

在应用开发趋于稳定后,就是时候离开开发环境、登台运行了。我们开始研究Node.js部署问题,目标很简单:自动化过程、一次构建随时部署。这正是我们对Java构建流程的要求,我们希望两者能够尽可能无缝地对接,并保持简单。

得益于基于云的部署系统,我们所需要做的仅仅是编写shell脚本,然后在 Hudson CI job上运行。无论何时有新代码签入主分支,Hudson CI job都会自动处理——通过shell脚本构建并打包Node.js bundle,最后将其推送到云端。云服务提供了简单的用户界面,可以选择环境(QA、演示或者前期制作),并且在相应的机器上运行该应用。

现在,我们已经在不同的稳定环境中运行了Node.js服务,整个部署过程比我们想象中简单、快速得多。

监控

在eBay,我们有集成在Java线程模型以及JVM层的日志记录API,在日志数据之上还有非常优秀的监控仪表盘,能够生成报告,并且能够在出错时实时地发布警报。我们也通过hook中心日志系统,为Node.js实现了类似的监控模块,并且实现了3个不同的日志记录API:

代码级日志记录。
机器级日志记录
负载平衡级日志记录。

此外,特别需要确保日志数据格式与既有Java应用完全相同,这样就可以使用相同的仪表盘,并且通过每个人都熟悉的方式接收报告。

其中最大的挑战在于Node.js事件循环的异步特性,这会导致处理的日志完全交叉。如何解决这一问题呢?首先试想一下下面的用例:Node进程从URL请求开始,通过异步回调返回了一个DB请求。该进程会在DB事务结束前和下一个请求并行。这对于Node.js这样的事件循环模型来说是一个非常常见的场景,多个URL请求的日志会因此交叉,因此日志报告会非常难以理解。最终我们分别为该问题制定了短期和长期的解决方案。

结论

在上面的工作结束后,我们Hackathon项目已经可以上线了,它也是eBay第一个使用Node.js作为后端的应用。目前该项目已经在内部试运行了,并且在性能方面得到了积极的反馈。激动人心的时刻就在前方!

得益于第一个Node.js后端应用的成功,eBay平台团队已经在着手开发一个运行在Node.js之上的成熟前端,它将能大大提升我们非前端特定功能的开发效率。对于前端工程师来说,梦想即将成真,我们可以自豪地宣告:“JavaScript无处不在!”