最近拜组里开发需要用了node开发web服务,框架选用的是koa,自带路由,nodejs本身工作线程是单线程,但相关阻塞操作可以异步处理并定义回调函数再交由主函数处理,同时koa定义了自己的genarator执行器,这个执行器要求对next的传入参数都必须是Promise对象,个人实现了一下这个执行器,执行原理应该如下:
function yieldProcess1(){
return new Promise((resolve,reject)=>{
resolve('yield process1');
})
}
function yieldProcess2(){
return new Promise((resolve,reject)=>{
resolve('yield process2');
})
}
function* genTemplate() {
let data1=yield yieldProcess1();
let data2=yield yieldProcess2()
}
function gen() {
let data1=(function())()
let data2=(function())()
}
function coroutine(generator) {
let gen=generator()
function next(arg){
let result=gen.next(arg)
if(result.done)
return
console.log(err)
})
}
next()
}
let beg=(new Date()).getTime();
for(i=0;i
coroutine(genTemplate);
}
console.log((new Date()).getTime()-beg)
beg=(new Date()).getTime();
for(i=0;i
gen()
}
console.log((new Date()).getTime()-beg)
koa调度主要函数如下:
function koaConcurrent(generator) {
let gen=generator()
function next(arg){
let result=gen.next(arg)
if(result.done)
return
console.log(err)
})
}
next()
}
这样就把原来的异步操作同步化了,同时在处理工作线程阻塞操作时通过coroutine让出了cpu时间片,有效的利用了cpu资源
但是目前来看单线程运行,性能再高还是没有办法利用好多核机器的优势。之后我们使用了PM2进程管理器,这是一个守护进程,会启动多个子进程处理连接请求,很好的利用多核资源,在开了四个子进程情况下,并发50的前提下qps达到270
继续优化时候netstat发现127.0.0.1有大量TIME_WAIT连接,就是本机nginx反向代理没有开足够的keepalive。调整之后,情况消失,同时性能进一步提高,并发50的前提下qps达到300以上,整体优化的也差不多了
目前来看node做web开发没有太大硬伤,虽然gc和jit可能不如老牌的java,但差距应该也不大,一些擅长js的前端程序员中小型的服务器开发可以优先选择。
领取专属 10元无门槛券
私享最新 技术干货