use*_*957 2 rest performance multithreading node.js
我有一个 Node.js 应用程序,它打开一个文件,扫描每一行,并为每一行进行涉及 Couchbase 的 REST 调用。一个文件的平均行数约为 12 至 1300 万行。目前,无需任何特殊设置,我的应用程序可以在大约 24 分钟内完全处理大约 100 万条记录。我浏览了很多问题、文章和 Node 文档,但找不到有关以下内容的任何信息:
背景:我们有一个现有的 java 应用程序,它通过生成 100 个线程来执行完全相同的操作,并且它能够实现比当前节点对应物稍好的吞吐量。但我想尝试节点,因为有问题的两个操作(读取文件并为每一行进行 REST 调用)对于节点应用程序来说似乎是完美的情况,因为它们都可以在节点中异步,而 Java 应用程序会阻止对这些操作的调用。 ..
任何帮助将不胜感激...
一般来说,您应该将 Stack Overflow 上的问题分解成多个部分。既然大家的问题都是同一个问题,那我就来回答一下吧。首先,让我从底部开始:
我们有一个现有的java应用程序,它通过生成100个线程来执行完全相同的操作...但我想尝试node,因为有问题的两个操作...对于node应用程序来说似乎是完美的情况,因为它们都可以在node中异步,而Java应用程序会阻止这些调用。
异步调用和阻塞调用只是帮助您控制流程和工作负载的工具。您的 Java 应用程序使用 100 个线程,因此一次有可能处理 100 个事情。您的 Node.js 应用程序可能有可能一次执行 1,000 件事,但某些操作将在单个线程上在 JavaScript 中完成,其他 IO 工作将从线程池中提取。无论如何,如果您调用的后端系统一次只能处理 20 件事情,那么这一切都无关紧要。如果您的系统已 100% 得到利用,那么改变您的工作方式肯定不会加快速度。
简而言之,异步并不是提高速度的工具,而是管理工作负载的工具。
节点可以同时打开 X 个 http 连接/套接字的设置在哪里?我可以改变它吗?
Node.js 的 HTTP 客户端自动有一个代理,允许您利用保持活动的连接。这也意味着除非您编写代码来执行此操作,否则您不会淹没单个主机。 http.globalAgent.maxSocket=1000是你想要的,如文档中所述: http://nodejs.org/api/http.html#http_agent_maxsockets
我必须规范文件处理,因为文件读取比 REST 调用快得多,所以一段时间后,打开的 REST 请求太多,它会阻塞系统并耗尽内存......所以现在我读取 1000 行等待让 REST 调用完成这些任务,然后恢复它(我正在使用流上的暂停和恢复方法来执行此操作)是否有更好的替代方案?
不要用于.on('data')您的流,请使用.on('readable'). 仅当您准备好时才从流中读取。我还建议使用转换流按行读取。
我可以执行什么所有可能的优化,以便它变得比这更快。我知道与 gc 相关的配置可以防止应用程序频繁停止。
如果不详细分析您的代码,这是不可能回答的。阅读有关 Node.js 及其内部工作原理的更多信息。如果您花一些时间在这上面,适合您的优化就会变得清晰。
是否推荐使用“集群”模块?它能无缝运行吗?
仅当您无法充分利用硬件时才需要这样做。目前尚不清楚“无缝”是什么意思,但就操作系统而言,每个进程都是它自己的进程,所以我不会称之为“无缝”。