关于node性能的问题

我们都知道node是因为Javascript语言的特性 (即:单线程 + event-loop)所以做到了节省服务器资源,以及相对的高性能
节省资源我能理解,但高性能,虽然我能理解一部分,但我假设了一种场景,然后我就想不通了

比如有一个功能,函数体主要是查询一个数据库表的数据,假设同一时间有10000次的并发量来访问,那么接下来假设执行栈10000次的执行一瞬间完成之后,任务队列里这时候就会有10000个等待执行的回调函数在排队。
那这么看的话,性能上也不见得会快啊,或者node有适合的应对机制?

比如java的话,我可以用多台服务器以分布式部署的方式,用硬件的量来打破这个瓶颈(虽然钱上面的开销就。。)
node的话,cpu就是直接的瓶颈了,那该肿么样处理这个问题呢?


刚刚初学node,这是我现在不理解的地方。请各位大神指点~

阅读 3.8k
4 个回答

我们从两个角度来看node的效率

一:从工具的角度来看

在我们准备要做一款产品或是实现一个功能的时候,其中很重要的一步就是技术选型,根据产品的特点和开发周期来评估(真是情况会复杂的多很多因素会影响技术选型)

  • node的优势就是动态语言门槛学习相对(c/c++)较低。

  • 甚至会javascript的前端同学稍微指导一下就能写。

二:从性能角度来看

  • 又不会像PHP传通的LAMP多进程那一套效率低。

  • 单线程异步特点项目前期即使不前后端分离也能有不俗的吞吐量。

三:但是也有缺点

  • 项目后期单线程异步比起传统的同步逻辑的编程调试会复杂点。

  • 过于底层的操作性能低,例如操作文件。

  • 动态语言没有严格的变量类型,对于大的项目来说增加调试难度,不过这些问题可以用现有的typescript解决

四:如果正确使用

现在我在项目中的做法是node做介入层仅仅只负责渲染页面用,请求发送到api服务器放入消息队列,消费端用go来实现业务逻辑(保证高效稳定)。

开什么玩笑,10000个等待执行的回调函数在排队?

node 只负责转发,不要用 node 做计算,任何超过 1 s 的处理都是错误的。如果有把这超过 1 s 的处理,使用 C 语言编写一个远程服务,使用 node 通过 socket 通信来转发服务。

node一般都是用来当做工具语言来使用,或者也可以当成前端和后端之间的胶水语言来用。

一个node进程里除了一个主线程外,还有JIT线程和GC线程.
node优势在于异步,编程时通过回调的写法能把涉及到I/O的操作卸载到事件池,从而避免阻塞到主线程处理下一个请求,事件池里的事件,处理完成时会自动执行回调函数,响应用户完成请求.

这也意味着,如果你的逻辑涉及到几个I/O操作,那么你就要通过嵌套回调来实现同步顺序执行.
比如连接MySQL有一个update更新后select查询的操作,你就应该把select查询的代码放到update更新操作的回调函数里面去,处理select查询并返回给用户的代码则需要放到select查询的回调函数里面去.如果逻辑非常复杂,回调嵌套的次数就可能很多,这时就不利于代码阅读和维护了.

另外需要注意的是,回调函数里的操作依旧是阻塞的,比如你有一个JS实现的排序操作,其他请求在这个排序操作完成之前不会被服务器当前node进程处理.

像极具代表性的Nginx,也是异步事件驱动的架构,通过多进程来利用多核.
单进程单工作线程确实是node的不足,所以官方才开发了一个多进程模块cluster来弥补这个缺点.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题