Node诞生于2009年3月。前端
Node的别名:Nodejs、NodeJS、Node.js。编程
设计高性能Web服务器的几个要点:事件驱动、非阻塞I/O。后端
考虑到高性能、符合事件驱动、没有历史包袱这三个主要缘由,JavaScript成为了Node的实现语言。浏览器
Node能够构建服务器、客户端、命令行工具,Node发展为一个强制不共享任何资源的单线程、单进程系统,其目的是成为一个构建快速、可伸缩的网络应用平台。性能优化
Node自身很是简单,经过通讯协议来组织许多Node,很是容易经过扩展来达到构建大型网络应用的目的。服务器
每个Node进程都构建成这个网络应用的一个节点,这是它名字所含意义的真谛。网络
Node打破了过去JavaScript只能在浏览器运行的局面,先后端编程环境统一,可大大减小先后端转换所须要的上下文交换代价。架构
做为后端JavaScript运行的平台,Node保留前端浏览器JavaScript中那些熟悉的接口,没有改变语言的任何特性,依旧依赖做用域和原型链,区别在于它将前端中普遍运用的思想迁移到服务端。异步
异步调用中对于结果值的捕获是符合"Don't call me, I will call you"原则。分布式
在Node中,绝大多数的操做都以异步的方式进行调用。
事件的编程方式具备轻量级、松耦合、只关注事务点等优点。
回调函数无处不在,在JavaScript中,函数做为一等公民,能够将函数做为对象传递给方法做为实参进行调用。
在Node中,JavaScript与其余线程没法共享任何状态。
单线程的优势:
单线程的缺点:
Web Works可以建立工做线程来进行计算,以解决JavaScript大计算阻塞UI渲染的问题。
工做线程为了避免阻塞主线程,经过消息传递的方式来传递运行结果,这也使得工做线程不能访问到主线程中的UI。
Node解决单线程中大计算量的方式:child_process(子线程)。
子进程:经过计算分发到各个子进程,能够将大量计算分解掉,而后经过进程之间的事件消息来传递结果,这能够很好地保持应用模型的简单和低依赖。
Node能够在Windows和*nix平台运行,得益于在操做系统与Node上层模块系统之间构建一层平台层架构,即libux。
Node的应用场景主要分为I/O密集型和CPU密集型。
Node面向网络且擅长并行I/O,可以有效地组织起更多的硬件资源,从而提供更多更好的服务。
I/O密集型的优点:
利用事件循坏的处理能力,而不是启动每个线程为每个请求服务,资源占有极少。
Node优秀的运算能力主要来自V8的深度性能优化。
CPU密集型应用给Node带来的挑战:
因为JavaScript单线程的缘由,若是长时间运行的计算(如大循环),将致使CPU时间片不能释放,使得后续I/O没法发起。可是适当调整和分解大型运算任务为多个小任务,使得运算可以适时释放,不阻塞I/O调用的发起,这样既能够同时受到并行异步I/O的好处,又能充分利用CPU。
Node充分利用CPU的方式:
CPU密集不可怕,如何合理调度是诀窍。
旧系统具备很是稳定的数据输出,持续为传统网站服务,同时为移动版提供数据源,Node将该数据源当作数据接口,发挥异步并行的优点。
阿里巴巴的数据平台。
Node的使用者: