javascript - Node JS对后端API的多个并发请求
问题描述
这是我的节点 js 后端 API 方法。
apiRouter.route('/makeComment')
.post((req, res) => {
consoleLogger.info("Inside makeComment API..");
logger.info("Inside makeComment");
let timestamp = new Date().getTime();
let latestCommentID = timestamp.toString();
console.log("comment ID generated is "+latestCommentID);
res.json({
'makeComment': 'success',
'commentid':latestCommentID
});
});
现在,如果多个并发请求来到这个 API,会发生什么?
据我了解,NodeJS 会为请求维护一个事件队列,并一一处理请求。
因此,不可能为两个不同的请求获得相同的时间戳。
请让我知道我的理解是否正确?
编辑1:
谷歌搜索了一段时间后,得到了这个链接,它清楚地解释了一些概念。
解决方案
您绝对可以在 2 个并发调用中获得相同的时间戳。但不是因为 NodeJS 或您的服务器并行处理请求,而是因为一毫秒足够长,您的服务器可以在同一毫秒内处理许多请求。
多线程与并发
您已经正确识别出并发和多线程之间微妙但重要的区别。在多线程环境中,两个不同的操作可以真正在 CPU 的 2 个不同内核上同时进行。在并发但单线程的环境中,事情确实按顺序发生,希望以非阻塞方式发生,而且非常快!
Javascript 是一个单线程环境。是的,它有一个事件循环,它将任务排队并一次处理一个。NodeJS(以及浏览器 Javascript 应用程序中的 Web API)提供某些异步功能,例如fs.writeFile
或fetch
,运行时与操作系统协作可以在相同或不同的线程/核心中执行,然后通过编排将结果返回给您的应用程序回调和承诺。
在您的示例中,您的处理程序(从 开始的部分(req, res) => { ... }
)仅包含同步调用。所以,是的,对这个处理程序的各种调用将依次运行,一个接一个。而且,虽然这个处理程序的两次运行不会真正同时发生,但它们会发生得非常快,并且您可能会遇到从 Date 对象获得相同毫秒值的情况。如果您有更高分辨率的时间戳可用(可能是纳秒),或者如果您的处理程序运行时间更长(例如,您运行了for
十亿次迭代的循环),那么您将能够更清楚地观察顺序行为。
避免在单线程应用程序中阻塞(同步)调用
这就是为什么建议您不要fs.writeFileSync
在 NodeJS Web 服务器中执行任何同步 IO 操作(例如,等等)的确切原因,因为当一个请求正在执行阻塞 IO 操作时,所有其他请求都在等待,并在事件循环中排队。
关于 Javascript 事件循环的非常好的视频;这应该阐明一些主题:https ://www.youtube.com/watch?v=8aGhZQkoFbQ
推荐阅读
- python - 有没有办法停止为 PyQt ListView 发出信号?
- javascript - React:我如何(动态?)从数据生成页面?
- nsis - 使用 NSIS 安装程序在 ini 文件中写入俄语符号
- github-actions - 当 GitHub Actions 上发生新推送时如何取消现有运行,但仅适用于 PR?
- c# - 即使已插入数据,多对多 ICollection 仍为空
- c++ - 'auto' 可以用作 C++ 中 lambda 参数的子类型吗?
- c++ - 二维数组中的分段错误
- python - 查找 2 个数据帧之间的差异
- javascript - 是否可以使用 peer.send() 发送流畅的音频?
- ios - 传入数据 MVVM RxSwift