我知道像 Rails 这样的“阻塞”服务器架构要求您将耗时的外部 API 调用卸载到工作进程(即作业队列),以防止它们阻塞服务器进程。
node.js也是这种情况吗?或者它的“非阻塞”架构是否意味着它可以在不拒绝或减慢后续服务器请求的情况下进行不完整的外部 API 调用?
node.js 的非阻塞特性和 node.js 中底层网络的实现不使用线程进行外部 API 调用,并且是这种访问类型的非常有效的实现。
node.js也是这种情况吗?或者它的“非阻塞”架构是否意味着它可以在不拒绝或减慢后续服务器请求的情况下进行不完整的外部 API 调用?
不,这不是 node.js 的情况。网络的非阻塞性质将为您处理此问题,而不会产生任何“减速”后果。
当然,每个打开的套接字都会消耗一些系统资源,并且 node.js 本身可能会对其同时打开的套接字数量施加一些限制(我认为该http
模块内置了可以配置的限制),但这仅意味着您要么必须确保在打开许多未完成的套接字时不会疯狂,要么您必须根据自己的情况仔细调整配置设置。
只是为了完成图片,node.js中有一些类型的I / O(例如文件I / O)确实使用内部线程池并且文件I / O的非阻塞性质是通过实际线程实现的,尽管这对 node.js 程序员来说几乎是完全透明的。但是,node.js 中的网络不是以这种方式实现的(它使用实际的非阻塞套接字)。