1、什么是NodeJs?
Node.js是一个让JavaScript运行在服务器的开发平台。
2、 NodeJs出现的背景
为了解决Web服务器的高并发性能问题(缩短发送到请求的时长)。
3、 NodeJs的特征
单线程:Node.js在执行的过程中会维护一个事件队列,程序在执行时在进入事件循环等待下一个事件到来。优点是减少了内存的开销,缺点是如果某一个事情,进入了,但是被I/O阻塞了,所以这个线程就阻塞了。
非阻塞I/O:不会傻等I/O语句结束,而会执行后面的语句。
由于Node.js中采用了非阻塞型I/O机制,因此在执行了访问数据库的代码之后,将立即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中,从而提高了程序的执行效率。
当某个I/O执行完毕时,将以事件的形式通知执行I/O操作的线程,线程执行这个事件的回调函数。为了处理异步I/O,线程必须有事件循环,不断的检查有没有未处理的事件,依次予以处理。
阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。而非阻塞模式下,一个线程永远在执行计算操作,这个线程的CPU核心利用率永远是100%。所以,这是一种特别有哲理的解决方案:与其人多,但是好多人闲着;还不如一个人玩命,往死里干活儿。
事件驱动:不管是新用户的请求,还是老用户的I/O完成,都将以事件方式加入事件环,等待调度。
4、为什么用 NodeJs
当前的服务器处理请求的方式有什么问题?
在Tomcat之类web容器中,对于每个连接都需要一个线程,当有新的http请求进来后,web容器便则会从线程池中获得一个线程来处理该请求(每个线程上下文大约占用 2 MB 的内存。在一个拥有 4 GB RAM 的jvm中,理论上最大的并发连接数量是 2,000个用户,当然,Tomcat容器也可以选择NIO方式来提高并发)。
Node对此进行了进一步的优化,对于每个连接,在 Node 引擎的进程中生成一个事件,而非分配一个线程或者采用多路复用。通过这种方式,nodeJs可以极大地降低内存资源的使用,实现其宣称的“能支持数万个并发连接”的目标。
网友评论