【发布时间】:2020-11-01 20:55:32
【问题描述】:
我正在尝试了解 node.js 单线程架构和事件循环,以使我们的应用程序更高效。所以考虑这种情况,我必须为一个 http api 调用进行几个数据库调用。我可以使用Promise.all() 或使用单独的await。
示例:
使用异步/等待
await inserToTable1();
await insertToTable2();
await updateTable3();
使用Promise.all() 我也可以这样做
await Promise.all[inserToTable1(), insertToTable2(), updateTable3()]
这里对于给定时间的一个 API 命中,Promise.all() 会更快地返回响应,因为它会并行触发数据库调用。但是,如果我每秒有 1000 次 API 命中,会有什么不同吗?对于这种情况,Promise.all() 是否更适合事件循环?
更新 假设以下, 1000 次 API 命中是指应用程序的总流量。考虑有 20-25 个 API。其中一些可能会执行 DB 操作,一些可能会进行一些 http 调用等。此外,我们永远不会达到 DB 池的最大连接数。
提前致谢!!
【问题讨论】:
-
Promise.all 如果只有一个 Promise 捕获,就会捕获。
-
使用 Promise.all([]),您需要获取数据库的可用连接数或 poolSize。如果数据库请求的数量超过该数量,您将限制并发。
-
按照我的理解,您的数据库将成为决定性因素。使用
Promise.all()和 1000 次点击,您将看到同时向数据库发出的最大3000查询,但是,如果您按顺序使用async/await,则向数据库发出的最大1000查询同时给出 1000 hits/second 假设。而且我认为您应该重视@StevenLu 所说的话,您的节点实例将有一个N连接的连接池,这将是一个瓶颈。 -
如果知道这件事真的很重要,那么您必须设计一个合适的测试工具和 MEASURE。在您衡量之前,没有多少教皇可以知道。
-
如果您运行的 CPU 密集型并行查询多于 MySQL 数据库中的内核数量,则更多并行化的结果可能会更糟。如果您使用的 I/O 多于磁盘的容量,则顺序 可能会更好。没有一般规则。就像其他人说的那样,测量 =)
标签: javascript node.js promise async-await event-loop