node.js 中的外部 API 调用是否需要工作进程?
Are worker processes necessary for external API calls in node.js?
我知道像 Rails 这样的 "blocking" 服务器架构要求您将耗时的外部 API 调用卸载到工作进程(即作业队列),以防止它们阻塞服务器进程。
node.js也是这样吗?或者它的 "non-blocking" 架构是否意味着它可以在不拒绝或减慢后续服务器请求的情况下进行不完整的外部 API 调用?
node.js 的非阻塞特性和 node.js 中底层网络的实现不使用线程进行外部 API 调用,是一个非常有效的实现那种类型的访问。
Is this also the case for node.js? Or does its "non-blocking"
architecture mean that it can have incomplete external API calls in
progress without rejecting or slowing down subsequent server requests?
不,node.js 不是这种情况。网络的非阻塞性质将为您处理此问题,而不会造成任何 "slowdown" 后果。
当然,每个打开的套接字都会消耗一些系统资源,node.js 本身可能会对同时打开的套接字数量施加一些限制(我认为 http
模块有一个内置的可以配置的限制),但这只是意味着你要么必须确保你不会在打开大量未完成的套接字的情况下变得狂野,要么你仔细调整你的情况的配置设置。
补充一下,node.js 中 I/O 的某些类型(例如文件 I/O)确实使用了内部线程池和非阻塞性质文件 I/O 是通过实际线程实现的,尽管这对 node.js 程序员几乎是完全透明的。但是,node.js 中的网络不是以这种方式实现的(它使用实际的非阻塞套接字)。
我知道像 Rails 这样的 "blocking" 服务器架构要求您将耗时的外部 API 调用卸载到工作进程(即作业队列),以防止它们阻塞服务器进程。
node.js也是这样吗?或者它的 "non-blocking" 架构是否意味着它可以在不拒绝或减慢后续服务器请求的情况下进行不完整的外部 API 调用?
node.js 的非阻塞特性和 node.js 中底层网络的实现不使用线程进行外部 API 调用,是一个非常有效的实现那种类型的访问。
Is this also the case for node.js? Or does its "non-blocking" architecture mean that it can have incomplete external API calls in progress without rejecting or slowing down subsequent server requests?
不,node.js 不是这种情况。网络的非阻塞性质将为您处理此问题,而不会造成任何 "slowdown" 后果。
当然,每个打开的套接字都会消耗一些系统资源,node.js 本身可能会对同时打开的套接字数量施加一些限制(我认为 http
模块有一个内置的可以配置的限制),但这只是意味着你要么必须确保你不会在打开大量未完成的套接字的情况下变得狂野,要么你仔细调整你的情况的配置设置。
补充一下,node.js 中 I/O 的某些类型(例如文件 I/O)确实使用了内部线程池和非阻塞性质文件 I/O 是通过实际线程实现的,尽管这对 node.js 程序员几乎是完全透明的。但是,node.js 中的网络不是以这种方式实现的(它使用实际的非阻塞套接字)。