前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Node.Js执行原理图引发的思考

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

作者头像
蛋未明
发布2018-06-07 15:55:16
1.1K0
发布2018-06-07 15:55:16
举报
文章被收录于专栏:蛋未明的专栏蛋未明的专栏

笔者忽然在群里面看到这幅图,主要是介绍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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014年02月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档