一、先后端耦合太紧密,中间加一层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
一些底层知识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不带数据直接返回,要获取数据还须要经过文件描述符再次读取。
好比银行,每次计算价格,java是多线程能够处理多个任务,而Nodejs是单线程用异步不停的写,写发上也很是复杂。能够有框架处理单线程问题,可是性能上仍是不如java。
完美的异步IO应该是应用程序发起阻塞调用,无需经过便利或者事件幻想等方式轮询。
前端的event loop跟node event loop不同,前端比node event loop还要复杂一些。node程序进来不停的转,就等于咱们把米放到电饭煲里,定好时间,咱们去忙别的,等他作好以后,会提示,已经作好了。
一、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()
一、高阶函数:能够将函数做为输入或者返回值,造成一种后续传递风格的结果接受方式,而非单一的返回值造成。后续传递风格的程序将函数业务重点从返回值传递到回调函数中。
app.use(function(){ //todo }) var emitter = new event.eventEmitter; emitter.on(function(){ //todo })
二、偏函数:指定部分参数产生一个新的定制函数的形式就是偏函数。node中异步编程很是常见,咱们经过哨兵变量会很容易形成业务的混乱。underscore,after变量。
一、step、wind(提供等待的异步库)、bigpipe、Q.js
二、Async、Await
三、Promise/Defferred是一种先执行异步调用,延迟传递的处理方式。Promise是高级接口,事件是低级接口。低级接口能够构建更多复杂的场景,高级接口一旦定义,不太容易变化,再也不有低级接口的灵活性,但对于解决问题很是有效。
四、因为Node基于V8的缘由,目前还不支持协程。协程不是进程或线程,其执行过程更相似于子例程,或者说不带返回值的函数调用。
一个程序能够包含多个协程,能够对比一个进程包含多个线程。来比较协程和线程。咱们知道多个线程相对独立,有本身的上下文,切换受系统控制;而协程也相对独立,有本身的上下文,可是其切换由本身控制,由当前协程切换到其余协程有当前协程来控制。
node使用javascript在服务端操做大内存对象受到了必定的限制,64位系统下约为1.4GB,32位系统是0.7GB
process.memoryUsage->rss、heaptTotal、heapUsed
V8的垃圾回收策略主要基于分代式垃圾回收机制。在自动垃圾回收的演变过程当中,人们发现没有一种垃圾回收算法可以胜任全部场景。V8内存分为新生代和老生代。新生代为存活时间较短对象,老圣代为存活时间较长的对象。
在分带基础上,新生代的对象主要经过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
model-view-Controller
javaweb多层架构
一、前端工程化的搭载动态文件的MAP分析压缩打包合并至CDN
二、单侧、压力测试、性能分析工具发现Bug
三、编写nginx-conf实现负载均衡和反向代理
四、PM2启动应用生序小流量灰度上线,修复Bug
五、上线前的不眠夜、你见过凌晨5点的北京么?
多线程
一、master进程均为主进程,Fork能够创造主进程。
二、经过child_process能够和NET模块组合,能够建立多个线程并监听统一端口。经过句柄传递完成自动启动、发射自杀信号、限量重启、负载均衡。
三、node默认的机制是采用操做系统的抢占式策略。闲着的进程争抢任务,可是会形成CPU闲置的IO暂时并未闲置。Node后来引入来Round-Robin机制,也叫轮询调度。主进程接受任务,在发。
四、每一个子进程作好本身的事,而后经过进程间通讯来将他们连接起来。这符合Unix的设计理念,每一个进程只作一件事,并作好。将福啊分解为简单,将简单组合程强大。
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虚拟服务器)通讯。