Node.js 获得企业开发者青睐

  • 崔康

2011 年 8 月 19 日

话题:Java.NETRubyWeb框架Ruby on Rails开源JavaScript微软最佳实践架构ChromeHTML5DevOpsNode.js语言 & 开发

如今,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.110.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 很可能会再次成为热点话题。

Java.NETRubyWeb框架Ruby on Rails开源JavaScript微软最佳实践