如今,Javascript在前端开发领域占据主导地位,成为Web开发人员的首选语言。Node作为服务器端的Javascript运行环境,帮助更多的人将技术延伸到后端系统。它具有无阻塞、事件驱动等特点,让熟悉Javascript的开发者无需学习Java、C++等传统“后台”语言就可快速简便地创建服务器端应用。不过,作为初出茅庐的Node,其成熟和健壮程度是否足够应用于企业级的生产环境中,一直是技术社区关注的热点。令人欣喜的是,我们看到越来越多的企业开发者在实际应用中采用了Node相关技术,并给予了肯定。这些企业包括LinkedIn、Yammer、GitHub、淘宝等,他们的实践和反馈值得技术社区参考。
在社交网站LinkedIn最新发布的移动应用中,HTML5技术抢占前端开发,而Node则是该移动应用的后台基础。LinkedIn移动开发主管Kiran Prasad对媒体表示,其整个移动软件平台都由Node构建而成:
LinkedIn内部使用了大量的技术,但是在移动服务器这一块,我们完全基于Node。
(使用它的原因)第一,是因为其灵活性。第二,如果你了解Node,就会发现它最擅长的事情是与其他服务通信。移动应用必须与我们的平台API和数据库交互。我们没有做太多数据分析。相比之前采用的Ruby on Rails技术,开发团队发现Node在性能方面提高很多。他们在每台物理机上跑了15个虚拟服务器(15个实例),其中4个实例即可处理双倍流量。容量评估基于负载测试的结果。
不过,Prasad也承认Node不是对所有任务都适合。他们的产品包含一个推荐引擎,需要处理大量的数据,Node就不能胜任。在被问到对于像Node这样新的技术,LinkedIn团队是否担心其不够成熟、无法应用到企业级产品中呢?Prasad表示的确存在顾虑,不过他在加入LinkedIn之前就已经对Node比较了解:
我们对许多潜在的平台做了分析,包括Ruby、Node、Java、Scala等,我们一直在使用它并观察其表现。这就是我们技术选型的方式,未来将继续尝试新技术,没有人会因为尝试新东西而遭受厄运。
追求新技术会给开发人员更多的发展机会,看看Node社区里,许多人是从Rails社区转移过来的。
企业社会化服务网站Yammer则利用Node创建了针对其自身平台的跨域代理服务器,第三方的开发人员可以通过该服务器实现从自身域托管的Javascript代码与Yammer平台API的AJAX通信。Yammer平台技术主管Jim Patterson对Node的优点和缺点提出了自己的看法:
(优点)因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求,因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。此外,与Node代理服务器交互的客户端代码是由javascript语言编写的,因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。
(缺点)Node是一个相对新的开源项目,所以不太稳定,它总是一直在变,而且缺少足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子。
知名项目托管网站GitHub也尝试了Node应用,其开发人员在博客中介绍了使用Node的情况。该Node应用称为NodeLoad,是一个存档下载服务器(每当你下载某个存储分支的tarball或者zip文件时就会用到它)。GitHub之前的存档下载服务器采用Ruby编写。在旧系统中,下载存档的请求会创建一个Resque任务。该任务实际上在存档服务器上运行一个git archive命令,从某个文件服务器中取出数据。然后,初始的请求分配给你一个小型Ruby Sinatra应用等待该任务。它其实只是在检查memcache flag是否存在,然后再重定向到最终的下载地址上。旧系统运行大约3个Sinatra实例和3个Resque worker。GitHub的开发人员觉得这是Node应用的好机会。Node基于事件驱动,相比Ruby的阻塞模型,Node能够更好地处理git存档。在编写新下载服务器过程中,开发人员觉得Node非常适合该功能,此外,他们还里利用了Node库socket.io来监控下载状态。
不仅在国内,Node的优点也同样吸引了国内开发人员的注意,淘宝就在产品中实际应用了Node技术。在今年5月份举行的NodeParty杭州站会议中,来自淘宝的朋春介绍了Node.js在淘宝中的一个使用案例:MyFOX。
MyFOX 是一个数据处理中间件,负责从一个MySQL集群中提取数据,计算,并输出统计结果。 用户提交一段SQL语句,MyFOX根据该SQL命令的语义,生成各个数据库分片所需要执行的查询语句,并发送至各个分片,再将结果进行汇总和计算。 MyFOX的特点是CPU密集,无文件IO,并只处理只读数据。起初MyFOX使用PHP编写,但遇到许多问题。例如PHP是单线程的,MySQL又需要阻塞查询,因此很难并发请求数据,后来的解决方案是使用nginx和dirzzle,并基于HTTP协议实现接口,并通过curl_multi_get命 令进行请求。不过MyFOX项目组最终还是决定使用Node.js来实现MyFOX。
朋春表示,选择Node.js有许多方面的原因,比如考虑了兴趣及社区发展,同时也希望可以提高并发能力,榨干CPU。例如,频繁地打开和关闭连接会让大量端口处于等待状态,当并发数量上去之后,时常会因为端口不够用(处于TIME_WAIT状态)而导致连接失败。之前往往是通过修改系统设置来减少等待时间以绕开这个错误,然而使用连接池便可以很好地解决这个问题。此外,以前MyFOX会在某些缓存失效的情况下出现十分密集的访问压力,使用 Node.js便可以共享查询状态,让某些请求“等待片刻”,以便系统重新填充缓存内容。
Node的应用领域不仅限于此。iSO应用公司Voxer利用Node创造更好的实时语音体验。Node帮助Voxer实现音频数据的即时传输时降低延迟。
Node的作用非常关键,因为音频需要即时性的,我们通过Node维护了大量的网络连接,而且延迟很低。这是一个显而易见的选择。
我们在做实时语音时尝试了三次。第一次基于性能原因使用了C++,但是它太复杂了,难以处理。接下来选择了Python。它自身非常不错,但是很不幸,Python虚拟机慢得令人抓狂。
所以我们走了另外一条路,在第三次尝试时选择了Node,现在是两全其美,一方面我们能够使用优秀的Javascript语言,另一方面也可以使用高性能的V8引擎。
事实上,除了刚才提到的几家企业之外,还有一个应用Node技术的重要厂商,就是Node的东家——Joyent。在去年底,Node.js正式获得知名云计算服务提供商Joyent的资助, 其项目负责人Ryan Dahl也加盟了Joyent,而Joyent看中的就是Node在企业应用中的潜力:
当时我们的团队正在寻找一种便捷的方法编写小巧、低延迟的网络服务器和代理端用于我们的基础设施管理产品,而摆脱对C、Erlang的依赖。我们认为Node.js的异步模型和JavaScript非常适合,因为我们已经在构建Joyent Smart Platform时爱上了它。我们意识到该项目的潜力并邀请Ryan加入Joyent,我们将为Node.js的成长提供坚定的支持。
看好Node的不仅是互联网企业,还有浏览器厂商,Mozilla今年早些时候宣布加入Node开源项目,准备将Node紧密依赖的Google Chrome的V8引擎,替换为Firefox使用的SpiderMonkey引擎,项目名为SpiderNode。由于Node与V8依赖性太高,因此Mozilla采用的方法是在SpiderMonkey中建立V8接口。Mozilla此举意在和Google抢占Javascript引擎市场。
由此可以看出,Node在企业级开发中的地位正在提高,开发者逐渐认识到Node的优点,并敢于应用在实际的产品中。那么Node的发展时机成熟吗?生态系统完善吗?InfoQ曾经采访了几位Node领域技术专家。
来自Express的TJ Holowaychuk认为,和其他很多社区相比,Node.js仍然很小。 他个人觉得这个项目(和社区)有很大的潜力,而且Django、 Drupal或Ruby on Rails最终也很有可能会跟进,甚至做出更大的贡献。
来自Socket.IO的Guillermo Rauch表示,Node正在非常迅速地成熟起来。在GitHub(http://github.com/ry/node)上, 它的追随者越来越多,逐渐赶超Rails,Rails无疑是最流行的Web应用开发框架之一。 而这只用了一段很短的时间。
来自Geddy的Matthew Eernisse则说,对有些目标来说它已经很成熟了, 但人们要像用Ruby或Python那样去进行通用的开发还为时尚早。也许还需要一段时间。
来自node-xmpp的Astro认为,Node. js有朝一日会很容易成为主流的, 因为JavaScript是个相当流行的语言。Node.js一直在发展,你应该经常针对新版本测试你的代码。 如果你打算让任何人都能运行你的代码,却不管用户的Node. js版本到底是新还是旧,我觉得这会有问题。
Node最近推出了两个新版本,分别是0.4.11和0.5.4,主要是修补了一些严重的缺陷,改进了一些功能。值得一提的是,Node目前已经移植到了Windows平台上,这是微软和Joynet在六月份达成的合作协议。虽然之前可以在一些兼容层如Cygwin上运行Node.js,但额外的安装步骤与需求使得很多人放弃了在微软平台上进行尝试的想法。现在有了Node.exe,用户可以更方便的在Windows平台上开发Node应用。据悉,微软通过IE9在HTML5上下了血本,之所以会在NodeJS上投入是看到了JavaScript使用率的不断攀升。将NodeJS移植到Windows服务器端将有助于其在Azure平台的的计划。具体的 Windows平台Node工具包可以从这里下载。笔者在Windows平台上尝试了Node.exe,对于一些简单的服务器应用,暂时没有发现问题。不过由于迁移过程需要改变Node内核,所以Node.exe还需更多的测试和检验。
除了自身发展和平台迁移外,Node发展的另一个利器是NPM的发布。NPM允许你使用npm install来获取更多的Node包。雅虎前端工程师陈广琛在Javascript专题会议(广州站)中详细介绍了NPM的好处和用法。陈广琛建议大家利用NPM搜索已有的工具包。NPM是针对NodeJS的包管理器,可以用来安装和发布NodeJS应用,它能够管理依赖等。除了利用第三方的工具包,陈广琛还介绍了如何构建自己的package。
从GitHub的访问流量上,我们可以看到Node的发展趋势,在过去三个月中,用户的访问次数超过73万,远远多于Rails的58万次。而就在半年之前,两者的访问量还不相上下。
早在今年4月份的Qcon北京2011大会上,我们就邀请了来自淘宝的技术专家廖凯做了有关Node内容的演讲,在国内技术社区中引起了广泛的关注。笔者作为现场主持人,充分感受到了听众对Node的浓厚兴趣,这也是Qcon大会的目的所在。随后,在各个Web技术论坛和讲座中,Node成为一个热点话题,国内Node社区CNodeJS组织了数次讲座,推广Node知识和经验,其翻译的Node中文文档对于初学者非常有益。
在10月份即将举行的Qcon杭州大会上,我们组织的一个主题是“脚本代码之美”,全部五个讲座都以Javascript和前端、后端的紧密联系为中心,Node很可能会再次成为热点话题。