关于node性能的问题

发布于 2022-09-03 08:34:26 字数 609 浏览 26 评论 0

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

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

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


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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

北凤男飞 2022-09-10 08:34:27

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

一:从工具的角度来看

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

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

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

二:从性能角度来看

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

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

三:但是也有缺点

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

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

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

四:如果正确使用

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

余生再见 2022-09-10 08:34:27

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

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

别念他 2022-09-10 08:34:27

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

挥剑断情 2022-09-10 08:34:27

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文