node.js深入浅出4-------node简介

3.23再次重复阅读

想到node,我们想到的就是他的高并发,利用这一点,他完全可以做一个高性能的web服务器,利用它作为web服务,优点就是强大的 高并发!所以相比于java/php这正是node的强大之处吧!

实际生产的时候我们经常用的就是搭建node集群,每个node都提供高并发的web服务,他们对外提供统一的服务,然后利用nginx进行负载均衡,反向代理这样对外提供统一服务。。。。。。。。

还有node相比其他编程语言的不同是,他的异步,之前我写java的时候好像就是同步,因为java的执行顺序是顺序的,而node不是,他是异步的,不必等待,感觉异步吧,就好像小学算最短时间一样,烧水的时候可以同时去洗菜,而同步就是烧水的时候只能烧水,洗菜的时候只能洗菜,不能干瘪的,而node的异步就是不一样,烧水的时候可以洗菜,你说他能不快吗,而且人家烧水也不耽误,烧的很好,人家洗菜也洗得很干净,谁让node是单线程异步io呢!

【异步编程本身就比同步编程快很多X!】

这样你算一下同步的时间等于洗菜+烧水的时间sum,,,而异步的时间等于那个最长的操作的时间,因为异步io对应多个io线程,不是很好吗,大概在生产是这样的:

1000个用户发来请求,对于java这个同步编程语言来讲,一个线程处理一个请求,java此时会开1000个线程来处理1000个用户的请求,而每一个java线程内部的执行顺序是同步顺序执行,

1000个用户发来请求,对于node这个异步编程语言来讲,一个主线程处理1000个请求,node只用了1个主线程就处理了1000个用户的请求,而每一个用户的请求的具体io处理都是由不同的io线程进行执行的,因此你懂的,首先内销小,接受用户请求快,而且多个io异步处理用户请求,而且还是异步处理,你觉的谁的分工好?

【综合感受一下,是否你觉得node异步编程+单线程执行模型就展示了他高并发高性能web服务器的优势了呢】

另外提到了异步编程,其实就可以考虑一门语言是如何处理他的异步编程的了,想一下其实就是依靠一定的机制,因为异步编程的返回数据必须要有某个东西接收,你懂吧,js中采用回调函数对异步编程数据接收,

【单线程异步io有什么坏处呢】

单线程注定无法利用多核心cpu,另外如果单线程处理下有大量的计算一直占用cpu,那么cpu对异步io的调用就会很。。。。

所以说node适合处理io密集型的项目,不适合处理cpu密集型的任务,

node的好处就是不是启动每一个线程为每一个请求服务,资源占用极少,一般使用node处理项目的,都是利用它的优点!

 

所以node的单线程本身就是好用,没错,单线程+io异步编程本身就是实力派,单线程处理请求快,io异步编程导致响应请求快

所以node的好处显而易见,处理请求快,响应请求也快!

 

(一)node的作者

我只能说ryan dahl这个人呀,做c++的大佬,原来人家的工作就是研究怎样的web服务器才能高性能,人家就总结出了高性能的web服务器是事件驱动的,是非阻塞io模型的,这个人对web服务器已经虎视眈眈很久了,瞄着apache web服务器也很久了,他就是想生成一个比apache服务器性能要高的web服务器,

于是人家选择了js这个没有阻塞包,非阻塞包的语言,

起初人家真的就只是想用js实现一个高性能的,非阻塞io的,事件驱动的web服务器,可人家后来发现慢慢自己的项目已经超过了web服务器的功能,甚至变成了一个可以构建网络应用的框架,在他之上可以构建出许多的工具,服务器,客户端,,,,,

最后node为构建大型分布网络应用而生,每个node进程构成了这个应用网络的一个节点

(二)看看浏览器和node各自的结构

浏览器和node的中间层都是用c++实现,以便于调用操作系统底层硬件

 libuv 是一个高性能事件驱动的程序库,封装了 Windows 和 Unix 平台一些底层特性,为开发者提供了统一的 API.

只不过浏览器的中间层提供了一些比较基于浏览器需求的c++代码,而node的中间层提供了调用底层操作系统文件系统磁盘之类的超底层c++代码,使得js可以运行在服务端

实际上浏览器和node都是基于事件驱动的异步架构,node使用和浏览器相同的机制原理运行,

(三)解释一下什么是异步啊?

异步:就是不同步

所谓的不同步是指数据请求与接收到数据的时间不是同一时刻

一般都是客户端向服务器发送异步请求,客户端继续执行其客户端进程,无需傻傻不工作的等待服务器传来数据,

其实js在前端使用的时候,ajax请求就是一种异步操作,客户端发起ajax请求,服务器接收请求进行处理,此时客户端不会等待服务器端的数据的传回而什么都不做,他会继续执行其他调用,待请求的数据传来后客户端在进行回调

同样js在后端使用的时候,文件操作本身就是一种异步请求,nodeweb服务器处理请求,此时客户端不会等待服务器端的数据的传回而什么都不做,他会继续执行其他调用,待请求的数据传来后客户端在进行回调,
 

(四)异步的api?

因为执行异步操作就可以支持单线程的高并发操作,因此我们需要配套一些异步的io库,因此,在服务端的js就必须开发出一套异步的io库,这些异步io库都是处在中间层,用c++实现

异步的话,优点就是省时间,其时间为所有需要的异步操作的调用的最长时间而同步的话,需要的时间就是累加。。。。。

(五)单线程

node保留了js在浏览器中单线程的特性,那当然,谁让node使用的是v8引擎的虚拟机呢

单线程的好处:不用统一状态,死锁不存在的,线程切换带来的性能开销不存在的

但是也是有缺点的的:不能利用多核cpu,一个错误会引起整个应用的崩溃,

(六)事件与回调函数

node为什么需要使用回调函数?

因为异步操作之后取出的数据,纵观一下回调函数是最好的接受异步调用返回数据的最好方式

(七)跨平台

node在中间层使用c++代码实现了跨屏台(windows和linux)

(八)node的应用场景

i/o密集型应用,分布式应用

(九)node的短板?怎么解决?

1)CPU密集型任务存在短板

如上所述,nodejs的机制是单线程,这个线程里面,有一个事件循环机制,处理所有的请求。如图所示。在事件处理过程中,它会智能地将一些涉及到IO、网络通信等耗时比较长的操作,交由worker threads去执行,执行完了再回调,这就是所谓的异步IO非阻塞吧。但是,那些非IO操作,只用CPU计算的操作,它就自己扛了,比如算什么斐波那契数列之类。它是单线程,这些自己扛的任务要一个接着一个地完成,前面那个没完成,后面的只能干等。因此,对CPU要求比较高的CPU密集型任务多的话,就有可能会造成号称高性能,适合高并发的node.js服务器反应缓慢。

 

2)无法利用CPU的多核

最开始,线程只是用于分配单个处理器处理时间的一种机制。但假如操作系统本身支持多个CPU/内核,那么每个线程都可以得到一个不同自己的CPU/内核,实现真正的“并行运算”。在这种情况下,多线程程序可以提高资源使用效率。Node.js是单线程程序,它只有一个event loop,也只占用一个CPU/内核。现在大部分服务器都是多CPU或多核的,当Node.js程序的event loop被CPU密集型的任务占用,导致有其它任务被阻塞时,却还有CPU/内核处于闲置的状态,造成资源的浪费。

解决方案

利用原生模块或第三方模块,开辟进程或子进程,用于处理这些特殊的任务。

3)如果有异常抛出,因为是单线程,整个项目将不可用。但这归根到底是代码的问题,糟糕的代码,不管什么体系,都会有问题,即使不崩溃。解决办法是用pm2等工具来运行?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值