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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

danhuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值