摘 要:如果要构建一个互联网应用,需要前端技术和服务器端技术的支持。主流的服务器端实现技术有java、php等,相对应的前端技术无疑是javascript。而新出现的nodeJS就是将前端和服务器端巧妙的结合起来,将javascript部署到服务器端,在服务器端构建高速javascript引擎。本文旨在讨论什么是nodeJS,为什么要用nodeJS,怎么部署使用nodeJS。
关键词:nodeJS;服务器端javascript;前端技术; 服务器;并行
引言
随着富客服端概念的流行,很多基于javascript的大型互联网应用出现在人们面前。但是javascript是有其天生的局限性的,比如对于浏览器环境的过分依赖,网络因素引起的代码出错的不稳定性。尽管已经有方案来解决这些问题,但是是以耗费额外的人力与效率为代价的。Javascript是基于客户端的引擎解析执行的,不同的浏览器引擎会有差异,既然这样为何不能把引擎搬到服务器端,彻底解决对客户端的依赖性,nodeJS就是基于这种想法而生。
1. 什么是node
回答这个问题之前,我们需要先了解V8引擎。V8是一个由丹麦iGoogle开发的开源javascript引擎。V8在执行javascript代码之前将其编译成了机器码,而非字节码或者是直译它,因此提升效能。而且,V8还使用了如内敛缓存等方法来提高性能。由于这些优化,javascript程序与V8引擎的速度媲美二进制编译。
了解了什么是V8引擎后,现在可以讨论什么是node了。概括的讲,node是一个javascript运行环境。它的实质是对google V8引擎进行了二次封装,并且优化了一些特殊用例,提供了替代的API,是的V8引擎在非浏览器环境得以顺畅运行。nodeJS只是javascript运行环境,这个是学习node的基本认知。
2. 为什么要用node
Node公开宣称的目标是“旨在提供一种简单的构建可伸缩网络程序的方法”。目前的服务器程序有什么问题呢?假设在Java和PHP这些服务器端语言中,每一个连接都会在服务器上生成一个新线程,假设每个线程需要2MB的配套内存。在一个拥有8GB RAM的服务器上,理论上支持的最大并发连接数就是4000个。随着网站访问人数的增加,就需要更多的服务器来满足更多并发数需求。这无疑会增加业务成本,具体体现在服务器成本、运输成本和人工成本。与此同时会产生一个新问题,用户可能与不同的服务器发生交互,因此需要在每台服务器上维护一套共享资源。这就是目前整个web应用程序框架的瓶颈:服务器所支持的最大并发连接数。
针对这一问题,node给出了自己的解决办法:改变连接连接到服务器的方式。每个连接生成一个进程,但是不需要给这个进程分配配套的内存块。Node不支持锁机制,也不会阻塞I/O调用。Node将整个系统的瓶颈从最大连接数转移到单个系统的流量。这将是对成本和效率的一次优化。
3. Node的工作原理
Node采用事件驱动、异步编程。事件驱动应该是个不陌生的概念。比如在java等编程语言里面,我们会用到回调函数。当socket对象满足一定的状态的时候,我们注册的回调函数就会执行。使用node的开发人员可以根据自己的业务需要来定制相应的回调函数。同时,这些定义的回调函数是异步执行的,意思是,这些回调看似在程序里是按顺序注册的,但是他们的触发是与顺序无关,只跟触发条件相关。同时Node采用了一系列“非阻塞”库来支持事件循环。其本质就是为文件系统和数据库之类的资源提供接口。当向文件系统发送请求的时候,不需要等待硬盘就绪,当硬盘准备好的时候,非阻塞接口会发出事件来通知node。这样做最重要的优势就是,充分利用了系统资源,节约了任务之间的等待时间,节省出来的资源可以为其他任务服务。在服务器开发过程中,并发数是一个很大的问题,传统阻塞式的函数会导致资源的浪费和延迟。通过事件机制和非阻塞编程,会大大提高资源利用率。因此,使用node是有其意义所在的。
同时node被设计为以单线程、单进程模式运行,和javascript的运行方式相一致。内部单线程高效的维护一个消息队列。
4. node的不足
node不是万能的,也有其不足之处。
1. 之前提到node是单线程、单进程模式,因此node会有稳定性方面的问题。在node中所有的请求是被维护在一个高速队列中,但是由于单线程、单进程模式,如果队列中有一个请求发生崩溃,那么整个队列都会受到影响。
2. Node虽然实现了将系统RAM的对性能的瓶颈转移到了系统的运算能力上,也就是对cpu的依赖加强,但是单进程单线程的模式是不能充分利用目前主流的多核处理器的。这也是一个很大的问题。
同时,node也针对这些问题给出了一些解决建议:
1. 使用软件进行负载均衡:就是为每个处理器单独启动一个NodeJs进程,每个进程都提供http服务并绑定到不同的端口,通过一个负载均衡软件来分发不同的请求到各个进程。
2. 使用操作系统内核做负载均衡:这个补丁是由雅虎在node-v0.1.98中提供的。改方法是创建一个进程来监听端口(如80端口),但是不同的是这个进程不接受socket链接,而是转发到其他子进程。OS内核本身负责进程间的负载均衡。
5. 结论
Nodejs虽然只有两年的生命,但是他的成长速度是惊人的。Nodejs的出现,彻底解决了javascript跨浏览器的难题。提供了对DOM和BOM的完美支持。并且js程序可以无缝移植到服务器端。通过巧妙的吧内存瓶颈转移到cpu瓶颈,大大提高了服务器的并发能力。但是同时也要看到,nodejs是有其缺点的。因此,需要根据具体的项目特点来考虑是否在项目中使用nodejs。
参考文献:
.