首先 描述下问题,前段时间接到了通知,做nodejs高并发代码优化,于是开始整咯,首先用loadrunning模拟高并发,问题就来了,到高并发路由的时候,会出现数据库连接数不够用的情况。查询了代码,都是一条语句执行完毕之后,:在callback中执行释放连接然后通知下一个语句去执行。应该是一个用户一个数据库连接就够了,而且我做了队列限制并发数,应该足够限制住连接数才对,可是每次还是蹭蹭蹭的往上飙然后连接数不够用报错。

经过一段时间的摸索,总结出原因,在代码中我用到了一个往同一张表中插入多条记录的时候递归插入,虽然每次执行完毕后会通知数据库释放连接,但接收到释放消息以及释放的时间远远大于逻辑处理时间,所以会有在高并发的时候连接数不够用的问题。也就只有在高并发的那个点会这样。

解决思路:将多条语句的insert整合成一条语句的insert语句,这样可以减少与数据库取得连接的开销,同时可以避免高并发的时候连接数不够用问题。


ps:附记录nodejs高并发的优化方向。本身nodejs对高并发处理真的特别牛逼,但是一个项目往往是由多个方便组成的,比如DB,静态资源,页面渲染等。那如何提高性能:nginx+redis+mysql+客户端渲染+ cluster。nginx处理静态资源cdn加速,redis作缓存(redis需要持久化关掉,同时将redis集群),mysql进行集群,页面渲染如果只依赖ejs那么高并发下ejs渲染量过大的话会很成倍的提高处理时间所以建议将一些渲染平摊到客户端的浏览器上。nodejs是单线程无法利用多核cpu?nonono,你可以利用多进程利用cpu的,cluster就可以让你做到nodejs将电脑多核利用起来。只要做到这些,nodejs处理高并发想并发多少就并发多少。

Logo

更多推荐