Node.Js执行原理图引发的思考

笔者忽然在群里面看到这幅图,主要是介绍Node.js的执行流程图。图中主要说明的一个事情是:Node.js会把所有的异步任务添加到一个事件池里,每次只需要循环执行事件池里面的任务。

从图中可以看到,Q1-Q4都是异步任务,而当任务涉及到IO操作时,则会立即的释放任务,执行下一个异步任务,因此从这个过程中我们会发现几个问题。

1、入过于出时 当异步IO的操作时间很长的时候,导致异步任务Q1-Q4的执行时间很久。假设T1-T14之间为30秒时,而这30秒内有5个任务进入,从而导致系统每30秒会在事件池中累积一个任务,最终导致的情况就是内存耗费会越来越大,从而导致内存不足,core异常。 在Node.js项目开发过程中,我是深刻体验到这个问题,当时主要的办法是控制时间由原来的30秒扩大到5分钟,或者是控制任务进入数量,每30秒我只从任务中拿取4个任务。所以对于大家所说的Node.js可以支持非常大的并发是有前提条件的,当然今天我说介绍的主要是在内存方面的限制。 大家可以想象,假设并发数是200个,而系统没秒钟处理的任务是150个,那么就会在系统每秒产生50个任务的异步事件积累,最终如果并发持续1天,那么会累计4320000个任务,假设一个任务占用0.1k,那么将会产生4320000*0.1/1000=432Mb的内存,在内存耗费越多的时候系统的处理内容也会越弱,这里还没有考虑,可想而知这将会是一个潜在的风险。

2、Q1执行时间久造成的异常 假设现在系统启动运行,刚好此刻有500个异步请求进来,而这500个异步请求都是在请求同一个接口登录,如果每个请求分别进行3次数据库操作,此时500*3=1500查询数据库请求,那么如果之前没有产生数据库句柄时,则Q1-Q500都会去尝试连接数据库。如果Q1连接时间大于1秒,那么Q1-Q500都因为之前没有数据库句柄从而都会尝试连接数据库,这样有可能导致数据库连接异常。 这种问题主要是在数据库连接时没有数据库操作句柄造成的,解决这种问题的最好办法就是在系统启动的时候就产生数据库操作句柄,这样Q1-Q500进入时都有该数据库操作句柄,从而无需请求句柄连接。

跟多关于node交流:blog.lovedan.cn

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猛牛哥的博客

hetzner独服安装proxmox过程

1.1K40
来自专栏风中追风

分布式进阶__zookeeper的zab协议工作原理之原子广播

paxos协议主要就是如何保证在分布式环网络环境下,各个服务器如何达成一致最终保证数据的一致性问题

550150
来自专栏BeJavaGod

nginx + fastDFS - 单机图片服务器解决方案

最近经常有人问图片上传怎么做,有哪些方案做比较好,也看到过有关于上传图片的做法,但是都不是最好的 ? 今天再这里简单讲一下上传图片以及图片服务器的大致理念(正式...

61860
来自专栏web前端教室

对前端的假数据那有一些不太懂,为什么要这么搞?

如标题所示,为什么要搞那些假数据?不太明白。这是web前端零基础0827的一个同学的作业邮件里问我的。

50830
来自专栏服务端技术杂谈

微服务架构关键词

模块即服务; 微服务使用库,库定义成内存里面的调用,微服务定义成web请求或远程调用; 独立可部署; 接口调用; 缺点是远程调用比本地重很多; 按业务逻辑进行分...

38150
来自专栏Java进阶

zookeeper的zab协议工作原理之原子广播

52260
来自专栏smartguys

(四):C++分布式实时应用框架——状态中心模块

  版权声明:本文版权及所用技术归属smartguys团队所有,对于抄袭,非经同意转载等行为保留法律追究的权利!

22950
来自专栏月色的自留地

mac电脑进行可见光通信实验要点

21740
来自专栏猿天地

hbuilder 开发5+ APP采坑记录

开发一款APP产品需要在安卓和苹果2大平台发布,同时开发团队也需要有安卓和IOS。 HTML5 Plus移动App,简称5+App,是一种基于HTML、JS、C...

83690
来自专栏Python中文社区

如何构建爬虫代理服务?

如何构建爬虫代理服务 专栏作者:Kaito 起因 做过爬虫的人应该都知道,抓的网站和数据多了,如果爬虫抓取速度过快,免不了触发网站的防爬机制,几乎用的同一招就是...

458100

扫码关注云+社区

领取腾讯云代金券