1、为什么Node.js用JS开发
Node.js 含有一系列内置模块,使得程序可以脱离 Apache HTTP Server 或 IIS,作为独立服务器运行。
首先,我们都清楚的是,同时接收数量众多的请求是服务器非常常见的情况。而web应用程序架构(包括流量、处理器速度和内存速度)中的瓶颈在于:服务器能够处理的并发连接的最大数量。解决这个瓶颈,有三种方法:
①系统线程模型:服务端只有一个线程,并发请求(用户)到达只能处理一个,其余的要先等待,这就是阻塞,正在享受服务的请求阻塞后面的请求了。
②多线程、线程池模型:调节服务端线程的数量来提高对并发请求的接收和响应,但并发量高的时候,请求仍然需要等待。它有个更严重的问题,就是服务端与客户端每建立一个连接,都要为这个连接分配一套配套的资源,主要体现为系统内存资源,以PHP为例,维护一个连接可能需要20M的内存。这就是为什么一般并发量一大,就需要多开服务器,负载均衡等,因为他占用的资源太多。
③异步、事件驱动模型:我们同样是要发起请求,等待服务器端响应。Node。js通过更改连接到服务器的方式,让每个连接发射(emit)一个在NodeJS引擎进程中运行的事件(Event),放进事件队列当中,而不是为每个连接生成一个新的OS线程(并为其分配一些配套内存),基于这样的机制,理论上陆续有用户请求连接,NodeJS都可以进行响应,因此NodeJS能支持比Java、PHP程序更高的并发量虽然维护事件队列也需要成本,再由于NodeJS是单线程,事件队列越长,得到响应的时间就越长,并发量上去还是会力不从心。
2、优缺点和适用场景
优点:
1、采用事件驱动、异步编程,为网络服务而设计。其实Javascript的匿名函数和闭包特性非常适合事件驱动、异步编程。而且JavaScript也简单易学,很多前端设计人员可以很快上手做后端设计。
2、Node.js非阻塞模式的IO处理给Node.js带来在相对低系统资源耗用下的高性能与出众的负载能力,非常适合用作依赖其它IO资源的中间层服务。
3、Node.js轻量高效,可以认为是数据密集型分布式部署环境下的实时应用系统的完美解决方案。
缺点:
1. 不适合CPU密集型应用;CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;
解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起;
2. 只支持单核CPU,不能充分利用CPU
3. 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃
Node非常适合如下情况:在响应客户端之前,您预计可能有很高的流量,但所需的服务器端逻辑和处理不一定很多。
3、关于web服务器和异步IO
我们常说的,购买阿里云服务器,腾讯云服务器中“服务器”三个字是硬件的概念,也称伺服器,是提供计算服务的设备。在网络环境下,根据服务器提供的服务类型不同,分为文件服务器,数据库服务器,应用程序服务器,WEB服务器等,这里的WEB服务器主要是指与提供网站相关服务的服务器,实际上就是一台电脑。
对于“web服务器”,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档, 也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。web服务器,是软件的概念,实际上指的是一种程序。
我们再来看看异步IO
首先,IO即输入输出(input/output),另外,阻塞IO也叫同步IO。直观的了解阻塞IO,可以使用jQuery的ajax() 方法发送get请求,将async设置为false,url设置为http://abzzzzzzc.top,你会发现浏览器被锁死了,因为没有返回,这就是阻塞的直观感觉。
异步IO是计算机操作系统对输入输出的一种处理方式:发起IO请求的线程不等IO操作完成,就继续执行随后的代码,IO结果用其他方式通知发起IO请求的程序。与异步IO相对的是更为常见的“同步(阻塞)IO”:发起IO请求的线程不从正在调用的IO操作函数返回(即被阻塞),直至IO操作完成。
参考:
百度百科:服务器,web服务器
维基百科:异步IO,Node.js
https://www.cnblogs.com/hojo/p/5325352.html
https://zhidao.baidu.com/question/2268321534762262068.html
https://juejin.im/book/5a8f9ddcf265da4e9f6fb959/section/5a8f9ed96fb9a0633229bddf