NodeJS的作者说,他创造NodeJS的目的是为了实现高性能Web服务器,他首先看重的是事件机制和异步IO模型的优越性,而不是JS。但是他需要选择一种编程语言实现他的想法,这种编程语言不能自带IO功能,并且需要能良好支持事件机制。JS没有自带IO功能,天生就用于处理浏览器中的DOM事件,并且拥有一大群程序员,因此就成为了天然的选择。
有了Node.js我们就可以抛弃PHP或者其他服务器语言了?
答案是否定的。
首先要理解Node.js的优点,以及Node.js与其他语言之间的区别和联系。传统的服务器语言,如PHP和Java等,每个Web HTTP请求连接都会产生一个线程,假设每个线程需要2MB的配置内存,因此相对一个8GB的服务器主机,也只能承受来自4000个并发用户的请求,当服务器承受不了这么多用户的情况下就需要添加服务器,从而导致增加项目运营成本(当然现在有Nginx支撑,可以提供更高的并发量请求)。
其次,理解Node.js解决的问题是什么?Node.js解决多请求的方法,在于其处理连接服务器的方式。在Node.js中每个HTTP连接都会发射一个在Node.js引擎的进程中运行的事件,而不是为每个连接生成一个新的OS进程(并为其分配一些配套内容)。
综上所述就可以清晰地看出Node.js相对PHP来说其优点在于能处理高并发请求,并且由于Node.js是事件驱动,因此可以更好地节约服务器内存资源。
在项目的开发中,我们应该如何抉择是否使用Node.js作为项目开发实现呢?首先,必须要了解项目的类型是不是适合Node.js去开发项目。例如需要开发一个博客、论坛或者微博,那么是否能使用Node.js去开发?回答是肯定的,但是不合适,相对来说PHP在这方面已经很成熟。
Node.js可以单独实现一个server,这也是Node.js一个非常大的优点,对于那些简单的server,通过Node.js实现比使用C++实现会简单得多。最后,牢记Node.js解决了长连接、多请求引发的成本问题,因此在一些项目,例如实时在线Game(如一些来画画、黑暗杀人游戏、实时休闲游戏等)、实时在线聊天室、实时消息推送功能、SNS实时交流、实时监控系统(如股票、系统运行状态等)等开发过程中,应该把握住机会,应用Node.js来开发。
Node.js的应用场景
适合
JSON APIs——构建一个Rest/JSON API服务,Node.js可以充分发挥其非阻塞IO模型以及JavaScript对JSON的功能支持(如JSON.stringfy函数)
单页面、多Ajax请求应用——如Gmail,前端有大量的异步请求,需要服务后端有极高的响应速度
基于Node.js开发Unix命令行工具——Node.js可以大量生产子进程,并以流的方式输出,这使得它非常适合做Unix命令行工具
流式数据——传统的Web应用,通常会将HTTP请求和响应看成是原子事件。而Node.js会充分利用流式数据这个特点,构建非常酷的应用。如实时文件上传系统transloadit
准实时应用系统——如聊天系统、微博系统,但Javascript是有垃圾回收机制的,这就意味着,系统的响应时间是不平滑的(GC垃圾回收会导致系统这一时刻停止工作)。如果想要构建硬实时应用系统,Erlang是个不错的选择
不适合
CPU使用率较重、IO使用率较轻的应用——如视频编码、人工智能等,Node.js的优势无法发挥
简单Web应用——此类应用的特点是,流量低、物理架构简单,Node.js无法提供像Ruby的Rails或者Python的Django这样强大的框架
Node能够最大限度利用硬件资源,其原因既如此。换句话说,CPU把绝大多数时间花在处理实际业务逻辑上,而不是线程或进程的等待和上下文切换上。在这种处理模式下,假如主线程阻塞,那说明真的是没有任务需要处理,而不是等待I/O结束。
我们知道了异步编程的诸多好处,主要体现在节约CPU资源、不阻塞、快速、高响应。但还有一点没有谈到,就是异步的编码范式几乎用不到锁,这在C++层面尤其体现出它的优势。我们惊奇地发现,不仅所有JavaScript代码均运行于主线程,对于完全异步的情况,C++代码也不需要使用锁。因为所有代码也运行在主线程,对象内部状态都在一个线程中维护。