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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。