扩展和执行Node.js应用程序
今天,Node.js是世界上使用最广泛的开发平台之一。它的生态系统庞大而强大,其性能也不差。
由于没有银弹,Node.js具有关注点,未被观察到的特性会影响使用它创建的应用程序的性能。
单胎和阻挡码
许多人可能已经知道,但重要的是要注意,Node.js是单步,即使存在异步操作(感谢libuv),一些操作被认为是阻塞并锁定任何代码执行。
在这个例子中我们使用 console.time
考虑一些代码片段的执行。
这段代码基本上有两个操作,一个是异步的 setTimeout
,和另一个同步,在函数的实现中 sleep
。此代码的异步部分应在1秒内执行,但在定时器的结果中,代码仅在执行代码的同步部分之后的3秒后执行。
要更好地理解此行为,请阅读有关事件循环的信息
之所以发生这种情况是因为Node / JS踏板陷入了单一操作,即阻塞操作。
阻止操作
在前面的例子中,有可能有理解这一点 while
是一种阻塞操作,这种类型的操作对应用程序有什么影响。除了 while
其他结构和功能也是阻塞的。 for,Array.prototype.forEach,Array.prototype.map,Array.prototype.reduce等。
我们可以假设每个循环都是一个阻塞操作。
单个阻塞操作在http应用程序中具有巨大的破坏性潜力。
一个非常简单的http服务器,为了测试它的性能,将使用攻城工具。
siege http://localhost:7337/ -b -i -t 10s
10秒钟,http服务器能够接收51,415个匹配为25的请求。以下是一些请求_logs
当然这是一个很好的结果。
在下一个图像中,路径现在执行500ms的阻塞操作。
用围攻再次进行性能测试。
10秒钟,25个并发进程只能成功执行18个请求。与之前的测试相比,这是一个急剧下跌。以下是一些请求日志。
每个请求至少需要500毫秒才能得到解答。您可以看到http服务器收到了43个请求,但测试在节点完成处理请求之前结束。
该节点能够在10秒内仅解析18个请求: 500ms * 18 = 9000ms = 9s
所有其他请求都“卡住”了。
这是在http节点服务器上执行同步阻塞操作的代价。
群集模式,多个服务器。
即使这个功能是一个严重的问题,也有一些有效的方法。
Node有一个名为cluster的模块。此模块允许您创建充当负载均衡器的进程/服务器的分支。
您可以在此处了解有关此模块的更多信息
在本文中,我们不打算直接讨论集群模式,而是讨论使用它来提供大量有用功能的工具,这些功能可以提高性能和应用程序运行状况。
PM2
在将节点应用程序投入生产时,PM2或Process Manager 2是不可或缺的工具。
PM2的两个关键特性可以突出显示,还有许多其他功能。
过程监控
PM2监视从它开始的每个过程,如果过程死亡,它本身重新启动过程而无需任何人为干预。
此功能对于确保在抛出异常且未处理异常时应用程序不会停止运行非常有用。
每个应用程序多个进程
除了保持应用程序活跃之外,PM2还可以为每个应用程序上载多个进程。这样我们就可以解决本文中提到的问题。
另一个有趣的事情是能够使用PM2上传多个应用程序。如果http应用程序需要一些其他支持并行进程(例如队列使用者),则可以完全控制它。
PM2在行动
在PM2文档中,您可以找到它的安装方式及其所有配置选项。下面您可以看到PM2在群集模式下使用的结果,在此示例中启动了5个流程。
pm2 start index.js -i 5
在这些条件下,http服务器能够在10秒内响应95个请求,这个值大于先前测试的18。
现在用10个过程进行相同的测试。
pm2 start index.js -i 10
现在该服务能够回答180个请求。下一个例子将包含20个进程,然后是40个进程。
pm2 start index.js -i 20
pm2 start index.js -i 40
使用20可以将请求数量增加一倍,但是没有40个进程。这仅仅是因为流程越来越多地竞争处理器。
生产环境
在这个例子中,我们使用了一台具有8个处理核心和13Gb RAM的机器。这些值高于许多常见服务器。这就是简单的流程扩展不够的原因,因此在构建应用程序时请记住这一点。在很多时候,有必要使用水平刻度。
每个服务器处理核心的进程数因应用程序而异,因此最好测试并确定如何在没有压力的情况下充分利用机器。
强烈建议使用自动缩放+泊坞窗等解决方案。
结论
即使Node.js是单踏板,也可以利用各种处理器内核。还有一个用于处理胎面的模块,提高了可能性。
这不是使用Node.js应用程序时应该考虑的唯一方面,因此不要仅限于本文和此处包含的信息。
性能根本不是一切,编写良好且经过测试的代码通常更为重要。即使应用程序投入生产的方式也很重要。
通过专注于提供高质量,遵循良好的写作和组织实践,许多与绩效相关的事情在早期得到解决。
如果您想了解我的工作,请访问dev.to/codecasts或blog.codecasts.com.br。订阅我们的YouTube频道,您将看到有关JavaScript,jQuery,Gulp,ES6,Vue.JS等的视频。另请务必联系Telegram的小组