关于node性能的问题
我们都知道node
是因为Javascript
语言的特性 (即:单线程
+
event-loop
)所以做到了节省服务器资源,以及相对的高性能
节省资源我能理解,但高性能,虽然我能理解一部分,但我假设了一种场景,然后我就想不通了
比如有一个功能,函数体主要是查询一个数据库表的数据,假设同一时间有10000
次的并发量来访问,那么接下来假设执行栈
中10000
次的执行一瞬间完成之后,任务队列
里这时候就会有10000
个等待执行的回调函数在排队。
那这么看的话,性能上也不见得会快啊,或者node
有适合的应对机制?
比如java
的话,我可以用多台服务器以分布式部署的方式,用硬件的量来打破这个瓶颈(虽然钱上面的开销就。。)
那node
的话,cpu
就是直接的瓶颈了,那该肿么样处理这个问题呢?
刚刚初学node
,这是我现在不理解的地方。请各位大神指点~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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来弥补这个缺点.