node项目架构与优化

为何要用node

一、先后端耦合太紧密,中间加一层node,还要给前端装一些乱七八糟的东西  java啥的服务环境。还有后台返回接口的时候无论前端需不须要那些接口一块儿返回,其实只用到1~2 条数据。原本ajax就很是消耗时的事,就用其中一条,用node作一层中间层处理把没用的接口剔除掉。javascript

二、好比:一个10天项目,后台开发6天,前台2天,测试2天。后台开发时,没有接口,前端得等着后台的接口,若是后台某种状况推迟了一天,前端就1天开发,测试要2天,确定前端开发不完。使用node咱们能够并行开发,提升开发效率。前端

三、proxy 代理层    java->node    前端->node  这种状况叫BFF,后台是没有跨域的。作了一层中间代理,能够本身控制路由,前端请求发给node,就不会出现跨域的问题。node socket io 实时通信。java

四、node容错,性能难作。node

node异步IO原理浅析及优化方案

  • 异步IO的是与非

    前端经过异步IO能够消除UI阻塞。
    假设请求资源A的时间为M,请求资源B的时间为N,那么同步的请求耗时就为M+N,若是采用异步的方式占用时间为MAX(M,N)。
    随着业务的复杂,会引入分布式系统,时间会线性的增长M+N+...和MAX(M,N,...),这会放大同步和异步之间的差别。
    I/O是昂贵的,分布式I/O是更昂贵的。

    一些底层知识linux

    一、nginx

      CPU是钟周期:1/CPU主频->1s/3.1GHzweb

      一级CPU是钟周期:3.5GHz   1/3.5*3  io时间ajax

    二、算法

    p是并行系统钟的处理器数量;编程

    f=ws/w为串行部分的比例;

     咱们分布到其余机器里,每一个机器都用一样的代码。网络要请求这文件,就比较慢 整个时间就比较长。

     并非全部的全部并行的好,也并很多全部串行就好,分状况。系统会自动根据状况来判断使用并行仍是串行。

    三、操做系统对计算机进行来抽象,将全部输入输出设备抽象为文件。内核在进行文件I/O操做时,经过文件描述符进行管理。应用程序若是须要进行I/O须要打开文件描述符,在进行文件和数据的读写。异步IO不带数据直接返回,要获取数据还须要经过文件描述符再次读取。

   

 

    

    NodeJS使用与IO密集型不适用于CPU密集型

    好比银行,每次计算价格,java是多线程能够处理多个任务,而Nodejs是单线程用异步不停的写,写发上也很是复杂。能够有框架处理单线程问题,可是性能上仍是不如java。

  • Node对异步IO实现

  完美的异步IO应该是应用程序发起阻塞调用,无需经过便利或者事件幻想等方式轮询。

前端的event loop跟node event loop不同,前端比node event loop还要复杂一些。node程序进来不停的转,就等于咱们把米放到电饭煲里,定好时间,咱们去忙别的,等他作好以后,会提示,已经作好了。

  • 几个特殊对API

    一、setTimeout和setInterval线程池不参与

    二、process.nextTick()实现相似setTimeout(function(){},0);每次调用放入队列中,在下一轮循环中取出。

    三、setImmediate();比provess.nextTick()优先级低

    四、Node如何实现一个Sleep?

    

async function test(){
  console.log('hello');
  await seelp(1000);
  console.log('word');         
}
function seelp(time){
  return new Promise(resolve=>setTimeout(resolve,time))
}
test()

 

  • 函数式编程在Node中对应用

    一、高阶函数:能够将函数做为输入或者返回值,造成一种后续传递风格的结果接受方式,而非单一的返回值造成。后续传递风格的程序将函数业务重点从返回值传递到回调函数中。

app.use(function(){
   //todo 
})
var emitter = new event.eventEmitter;
emitter.on(function(){
    //todo
})

    二、偏函数:指定部分参数产生一个新的定制函数的形式就是偏函数。node中异步编程很是常见,咱们经过哨兵变量会很容易形成业务的混乱。underscore,after变量。

  • 经常使用的Node控制异步API的技术手段

    一、step、wind(提供等待的异步库)、bigpipe、Q.js

    二、Async、Await

    三、Promise/Defferred是一种先执行异步调用,延迟传递的处理方式。Promise是高级接口,事件是低级接口。低级接口能够构建更多复杂的场景,高级接口一旦定义,不太容易变化,再也不有低级接口的灵活性,但对于解决问题很是有效。

    四、因为Node基于V8的缘由,目前还不支持协程。协程不是进程或线程,其执行过程更相似于子例程,或者说不带返回值的函数调用。

    一个程序能够包含多个协程,能够对比一个进程包含多个线程。来比较协程和线程。咱们知道多个线程相对独立,有本身的上下文,切换受系统控制;而协程也相对独立,有本身的上下文,可是其切换由本身控制,由当前协程切换到其余协程有当前协程来控制。

内存管理与优化

   V8垃圾回收机制

    node使用javascript在服务端操做大内存对象受到了必定的限制,64位系统下约为1.4GB,32位系统是0.7GB

    process.memoryUsage->rss、heaptTotal、heapUsed

    V8的垃圾回收策略主要基于分代式垃圾回收机制。在自动垃圾回收的演变过程当中,人们发现没有一种垃圾回收算法可以胜任全部场景。V8内存分为新生代和老生代。新生代为存活时间较短对象,老圣代为存活时间较长的对象。

   Scavenge算法

    在分带基础上,新生代的对象主要经过Scavenge算法进行垃圾回收,在具体实现时主要采用cheney算法,cheney算法是一种采用复制的方法实现的垃圾回收算法。它将内存一分为二,每个空间称为semispace。这两个semispace中一个处于使用,一个处于闲置。处于使用的称之为From,检查From存活对象复制到To。非存活被释放。而后互换位置。再次进行回收,发现被回收过直接晋升,或者发现To空间已经使用来超过25%。他的缺点只能使用堆内存的一半,这是一个典型的空间换时间的办法,可是新生代生命周期较短,偏偏就适合这个算法。

  

  老生代空间生成完成确定要有东西管理它,就有来mark-sweep和mark-compact

    V8老生代主要采用mark-sweep和mark-compact,在使用Scavenge不合适。一个是对象较多须要赋值量太大并且仍是没能解决空间问题。Mark-Sweep是标记清除,标记那些死亡的对象,而后清除。可是清除事后出现内存不连续的状况,全部咱们要使用Mark-Compact,他是基于mark-sweep演变而来的,它现将活着的对象移到一边,移动完成后,直接清理边界外的内存。当CPU空间不足的时候会很是高效。V8还引入来延迟处理,增量处理,并计划引入并标记处理。

  

  常见的内存泄漏问题

  一、无限制增加的数组

  二、无限制设置属性和值

  三、任何模块内的私有变量和方法均是永驻内存的a=null

  四、大循环,无GC(垃圾回收机制)机会

  内存泄漏分析

  node-inspector

  console.log("Server PID",process.pid);

  sodu node --inspect app.js

  whie true;do curl "http:localhost:1337/";done

  top -pid 2322

大规模Node站点结构原理分析

  经典的MVC框架

  model-view-Controller

javaweb多层架构

node 集群应用

   预备上线

  一、前端工程化的搭载动态文件的MAP分析压缩打包合并至CDN

  二、单侧、压力测试、性能分析工具发现Bug

  三、编写nginx-conf实现负载均衡和反向代理

  四、PM2启动应用生序小流量灰度上线,修复Bug

  五、上线前的不眠夜、你见过凌晨5点的北京么?

  多线程

  一、master进程均为主进程,Fork能够创造主进程。

  二、经过child_process能够和NET模块组合,能够建立多个线程并监听统一端口。经过句柄传递完成自动启动、发射自杀信号、限量重启、负载均衡。

  三、node默认的机制是采用操做系统的抢占式策略。闲着的进程争抢任务,可是会形成CPU闲置的IO暂时并未闲置。Node后来引入来Round-Robin机制,也叫轮询调度。主进程接受任务,在发。

  四、每一个子进程作好本身的事,而后经过进程间通讯来将他们连接起来。这符合Unix的设计理念,每一个进程只作一件事,并作好。将福啊分解为简单,将简单组合程强大。

  PM2

  pm2是一个自带负载均衡功能的node应用的进程管理器。

  当你要把你的独立代码利用所有的服务器上的全部CPU,并保证进程永远活着,0秒重载。

  一、内建负载均衡(使用node cluster集群模块)

  二、后台运行

  三、0秒停机重仔

  四、具备Ubuntu和CentOS的启动脚本

  五、中止不稳定的进程(避免无限循环)

  六、控制台检测

  七、提供HTTP API

  八、远程控制和实时的接口API(Nodejs 模块,容许和PM2进程管理交互)

    测试过Nodejs v0.11 v0.10 v0.8版本,兼容CoffeeScript,基于linux和MacOs

  

我以前是前端连java感受还能够,若是我中间加一层node,是否是就变慢了呢,并非,首先java跟node在一样一个机房他俩请求的时间被严格限制在1ms(毫秒),甚至一些团队100ms已经顶天了,300ms服务确定有问题。用户确定没法感知的,node和java走了一次http,会有3次握手,即便是毫秒也是一次浪费,node和java 走的是Linux Virtual Server(Linux虚拟服务器)通讯。

相关文章
相关标签/搜索