Node.js服务器技术初探

2014-06-20 13:35骆文亮
无线互联科技 2014年3期

骆文亮

摘 要:通过对Node.js技术的简介,引出Node.js的基本概念、功能和它能解决的问题以及Node.js的应用场景。

关键词:Java;JSON;Javascript

1 引言

从2009年Node.js的诞生至今,已有近5年时间,其成长速度令人咂舌。国外大量的社区对Node.js的前景充分肯定,各种实际应用层出不穷。而国内这方面发展相对缓慢,Node.js中文社区也活跃着很多开发者。本文通过对Node.js的介绍,提出Node.js的基本概念、功能和实际应用场合。希望对开发人员有所帮助。

2 Node.js简介

2.1 Google V8 JavaScript引擎

Google公司著名的浏览器Chrome浏览器就是基于Google V8 JavaScript引擎的高速浏览器。V8是由丹麦Google开发的开源JavaScript引擎。V8在执行之前将JavaScript编译成了机器码,而非位元组码或是直译它,以此提升效能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。

为了缩短由垃圾收集造成的停顿,V8使用stop-the-world, generational, accurate的垃圾收集器。在执行回收之时会暂时中断程序的执行,而且只处理物件堆叠。还会收集内存内所有物件的指标,可以避免内存溢位的情况。

2.2 Node.js基本概念

Node.js是服务器端的JavaScript运行环境,它具有无阻塞(non-blocking)和事件驱动(event-driven)等的特色,Node.js采用V8引擎,同样,Node.js实现了类似Apache和 nginx的web服务,让你可以通过它来搭建基于JavaScript的 Web App。

Node.js是一个可以快速构建网络服务及应用的平臺,它的构建是基于Chrome's JavaScript runtime,它可以很好地工作与非浏览器环境。总之,Node.js是一个脱离了浏览器的Javascript。

3 Node.js功能

3.1 Node.js解决的问题

在很多情况下,服务器端的性能瓶颈主要在于大量的数据请求让服务器疲于应付,造成大量的阻塞。Node.JS的诞生就是用来解决服务端阻塞问题。例如,当客户端通过一句查询语句来查询一些信息时,程序进程往往只是在等待结果的返回,浪费了大量的时间不说,还这就造成了进程的阻塞。在对于高并发,I/O密集型的WebAPP中,一方面服务器让进程很长时间处于等待状态,另一方面为了应付新的请求不断的增加新的进程。这样的浪费会导致系统的实际性能远远小于它能够支撑性能,这个就是系统的瓶颈,而且这样的系统也特别容易被黑客利用慢链接攻击。

3.2 Node.js解决问题的基本思路

Node.js解决阻塞问题的思路是,建立一种事件机制,发起查询请求之后,立即将进程交出,当数据返回后触发事件,再继续处理数据。

要达到上述目的,需要语言能够提供一套高效的异步事件调度机制。而主要用于处理浏览器端的各种交互事件的JavaScript相对于其他语言,至少有两个关键点特别适合完成这个任务:

1)JavaScript是一种函数式编程语言,函数编程语言最重要的数学基础是λ演算(lambda calculus)——即函数可以接受函数当作输入(参数)和输出(返回值)。

2)JavaScript支持“闭包”。在复杂的应用中,一定会遇到这类场景。即在函数运行时需要访问函数定义时的上下文数据。而在异步编程中,函数的定义和运行又分处不同的时间段,那么保持上下文的问题变得更加突出。JavaScript支持的“闭包”能够较好地处理这个问题。

4 Node.js应用场景

4.1 I/O密集型

在I/O密集型的应用场景中,Node,js的并行I/O能力,能够非常有效地利用的硬件资源,从而提供更多好的服务。I/O密集的优势主要在于Node利用事件循环的处理能力,而不是启动每一个线程为每一个请求服务,资源占用极少。

4.2 不擅长CPU密集型

最显而易见的情况就是是那种CPU使用率高同时I/O操作小的。所以如果你打算写一个视频编码软件,人工智能软件或者类似的CPU使用率高的软件,请不要用node.js。

4.3 分布式应用

淘宝的数据平台是国内对Node的分布式应用是一个典型的例子。分布式应用意味着对可伸缩性的要求非常高。数据平台通常要在一个数据库集群中去寻找需要的数据。这个案例其实也是高效利用并行I/O的例子。Node高效利用并行I/O的过程,也是高效使用数据库的过程。对于Node,这个行为只是一次普通的I/O。对于数据库而言,却是一次复杂的计算,所以也是进而充分压榨硬件资源的过程。

5 结束语

从本文可以看出,Node完成了它提供高度可伸缩服务器的目标。它使用了Google的一个非常快速的JavaScript引擎,即V8引擎。它使用一个事件驱动设计来保持代码最小且易于阅读。所有这些因素促成了Node的理想目标,即编写一个高度可伸缩的解决方案变得比较容易。

[参考文献]

[1]Mike Cantelon,TJ Holowaychuk.Node.js in Action 2011.

[2]http://limu.iteye.com/blog/1013223.,2013-01-17.

[3]http://cnodejs.org/topic/4f97d5b8407edba21.2013-04-23.

[4]朴灵.深入浅出Node.js.人民邮电出版社.