eBay:编写第一个 Node.js 应用的经验

简介: 在大多数情况下,eBay基于Java的技术运转着。我们整个工作流程的中心围绕着Java和JVM。考虑到网络访问的规模以及像ebay.com这样类型的网站所需要的稳定性,采用成熟的技术是一个显而易见的选择。但我们一直对新技术持开放态度,Node.js摘得候选人名单中最受关注技术已经有相当长的一段时间了。这篇文章对我们如何开发eBay的第一个Node.js应用的几个方面做了重点阐述。

在大多数情况下,eBay基于Java的技术运转着。我们整个工作流程的中心围绕着Java和JVM。考虑到网络访问的规模以及像ebay.com这样类型的网站所需要的稳定性,采用成熟的技术是一个显而易见的选择。但我们一直对新技术持开放态度,Node.js摘得候选人名单中最受关注技术已经有相当长的一段时间了。这篇文章对我们如何开发eBay的第一个Node.js应用的几个方面做了重点阐述。


伸缩性

这开始于一些eBay工程师(Steven,VenkatSenthil)想把“eBay Hackathon”编程大赛的获奖作品"Talk"用于生产环境。当时我们发现java不适合项目要求(没要冒犯的意思),于是开始研究Node.js。现在我们完全使用Node.js开发并投入运行。


这个项目有两个核心要求。第一是尽可能的实时性,也就是维护活动连接。第二是组织各种eBay服务的信息显示在页面,即处理有I/O限制的操作。开始时用Java搭建基础,但比预想的资源要多,伸缩性很有问题。这些障碍令我们从草稿里做了新中间编配器(orchestrator),并发现Node.js似乎是更好的选择。


观念

eBay由Java开发,Java是高效的强类型语言,那时很难说服人们用JavaScript做后端,有类型安全、错误处理、延展性等问题。而且,JavaScript(世界上最被误解的语言)本身也给争论添油加醋。为了解决问题,我们做一个内部备忘,请工程师们提意见,问题,疑虑和一切与Node.js相关的。


几天后,我们有了详尽的工作列表。如预料中,主要的问题集中在堆栈可靠性和处理之前Java实现的功能的效率。我们回答每个问题,提供实际例子的细节。同时这些例子让大家开眼界,并发现一些以前没考虑到的问题。最后,大家都理解了Node.js的核心价值,明白了其美妙之处。


经过同行们的测试,我们明白,可以开搞了。


启动

我们从一张白纸开始。想先构建一个足够小的Node.js底板然后扩展,而不是引入一个专用的框架。最先的四个Node模块express,cluster,requestasync。数据储存采用MongoDB,易用而且eBay已经有内部建设。基本设置好,我们的服务可以在开发沙盒中运行了,接受请求,处理一些eBay的API,存储数据。


为了端对端测试,我们配置了一些前端服务器指向Node.js服务,看起来一切良好,可以继续下一步。我们列出了所有用户用例,明确REST节点,设计数据模型和模式,确定最佳的Node模块以使用,并开始实现各节点。接下来的几周,我们低着头,coding和coding。


部署

当应用开发到一个稳定点时,就是时候开始从开发状态转向阶段测试环境了。这时我们开始查看有关部署的Node.js技术栈。我们部署的目标很明确:自动化部署,一次构建,处处运行。这是Java的部署方式,我们也希望Node.js部署也尽可能的无缝而简单。


我们可以使用我们已有的基于云的部署环境。我们所要做的就是编写一个shell脚本并让其在我们的Hudson 持续集成服务器(CI)上运行。一旦新的代码被提交到master分支上,Hudson CI就开始自动部署。使用这个脚本,服务器就可以构建并打包Node.js应用并将其部署到云上。云端提供了简单的接口来选择运行环境(QA、阶段测试、预发布),然后我们就可以在有关的机器上运行了。


现在我们有了自己的Node.js Web服务运行在许多稳定环境中。整个部署步骤比我们想象的要更快、更简单。


监控

在eBay,我们有专门的日志API与Java线程和JVM集成在一起。一个好的基于这些日志数据的监控面板可以很好的随时反应可能出现的问题。我们与中央日志系统进行对接,为Node.js也创建了类似的监控系统。我们很幸运,我们有现成的日志API。我们开发了一个日志模块并实现了三种不同的日志API:


源码级日志 - 这个等级包括错误/异常,数据库队列,HTTP请求,元数据交易等等。

机器级日志 - 这个等级包括CPU/内存和其他操作系统的运行状况。机器级日志运行于集群模块层中,我们扩展了npm cluster module并创建了eBay定制版。


负载均衡器级日志 - 所有的使用Node.js的机器都工作于一个负载均衡器之后,它负责向机器周期性地发送信息并保证一切运转良好。一旦有一台机器宕掉,负载均衡器就会紧急启用备用机器,并向运维和工程小组发出警告。


我们确保其生成的日志文件格式与Java版本的日志相一致,这样就可以生成与原来相同的大家熟悉的面板和报告了。


一个有关日志的主要难题在于Node.js event loop的异步特性。这将导致各项业务的顺序完全混杂在一起。下面这个例子可以让你更好的了解这个问题:Node通过异步调用启动了一次URL处理并访问数据库。这个过程将在数据库访问完成之前和下一次请求一并进行。这在诸如Node.js一类的事件驱动引擎中非常普遍,各种日志关于URL处理的日志混杂在一起,报告工具会生成混乱的输出。我们同时必须给出这个问题的短期和长期解决方案。


结论

完成了以上这些工作,我们可以让Hackathon项目运行起来了。这是eBay第一个以Node.js作为后端的应用。我们已经在内部员工之间进行了测试,有关其性能的反馈都相当不错。未来将更加精彩!


我们要为我们内部的Node.js专家Cylus Penkar喝彩,他一直在为这个项目进行引导并作出了贡献。有了这次Node.js后端的成功,eBay的技术团队正在使用Node.js打造一个完善的前端技术栈。这将包括我们现在大部分资源,这些功能包括本地化、资源管理(JS/CSS/images)以及项目跟踪。对于前端工程师来说,梦想实现了。我们可以自豪的说: “JavaScript is EVERYWHERE.”


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
7月前
|
JavaScript 前端开发
如何减少Node.js应用中的全局变量?
如何减少Node.js应用中的全局变量?
436 133
|
7月前
|
监控 负载均衡 JavaScript
有哪些有效的方法可以优化Node.js应用的性能?
有哪些有效的方法可以优化Node.js应用的性能?
383 69
|
4月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
217 0
|
3月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
259 3
|
4月前
|
资源调度 负载均衡 JavaScript
使用PM2工具部署Vue.js应用于服务器
以上步骤完成之后,你就成功利⽤ PM⼆工具将 Vuejs 应⽰程序部署至服 务 器,并且配合反向代理实现了高效稳定访问及负载均衡功能。
204 0
|
8月前
|
前端开发 搜索推荐 JavaScript
如何通过DIY.JS快速构建出一个DIY手机壳、T恤的应用?
DIY.JS 是一款基于原生 Canvas 的业务级图形库,专注于商品定制的图形交互功能,帮助开发者轻松实现个性化设计。适用于 T 恤、手机壳等多种商品场景。它自带丰富功能,无需从零构建,快速集成到项目中。通过创建舞台、添加模型、定义 DIY 区域和添加素材四个步骤即可完成基础用法。支持在线演示体验,文档详细,易上手。
364 57
|
7月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
204 3
|
8月前
|
存储 JavaScript 前端开发
|
9月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
9月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~