【问题标题】:Using `await` when caller does not expect a response当调用者不期望响应时使用`await`
【发布时间】:2021-08-11 21:49:15
【问题描述】:

我有一个非常简单的快速应用程序,它将从客户端接收到的信息存储到数据库中,几乎没有任何处理。一些简化的代码来说明这一点:

app.post(ANALYTICS_ENDPOINT, async (req, res) => {
  try {
    await insertToDB(req.body)
    res.status(204).send();
  } catch (err) {
    logger.error(err);
    res.status(500).send();
  }
});

此应用程序部署到谷歌云运行并每秒处理大量请求。我们注意到,从路由中删除 await 关键字允许每个容器处理更多请求,但缺点是无法捕获错误 - 因此客户端将始终收到 204

await 的另一个用途是在 insertToDB 函数中,再次简化如下:

const insertToDB = async (row) => {
  await dbClient.insert(row);
}

正如您在此处看到的,我们也使用await,因为此操作返回一个 Promise。

所以问题是,当调用者不期望响应时,我们是否应该等待?是否可以避免这些等待,我们可以在我们的应用程序上处理更多的吞吐量?

编辑: 有一个类似的问题here。但我认为这是不同的,因为我最感兴趣的是了解为什么删除 await 可以让我每秒处理 2/3 倍的请求数。

【问题讨论】:

  • 吞吐量取决于瓶颈。如果它是 db,它保持不变,但你对它的控制较少。无论结果如何,您都可以决定是否成功响应或等待承诺。如果不等待,显然更难检测到问题,因为它在客户端看起来没问题。在这种情况下,明显的问题是不会处理错误。如果异步作业与请求分开,至少要确保错误得到处理和记录
  • 看来 OP 没有写一个明确的问题来描述他们真正想要问的问题。如果您尝试回答他们问题的这一部分那么问题是,当呼叫者不期望回复时我们是否应该等待?,您将被否决,因为他们不实际上根本不想要一个讨论这个问题的答案。
  • @jfriend00 你在这里做什么有什么意义?我确实想要回答,而不是关于通用编码最佳实践的段落,可以概括为“你应该处理错误”。不过,我非常感谢您的回复。

标签: javascript node.js express asynchronous async-await


【解决方案1】:

您应该等待,因为您的 db 调用是 async,因此您必须等待插入完成才能返回客户端。

您可以简单地使用 Promise 解析更简洁明了:

app.post(ANALYTICS_ENDPOINT, async (req, res) => {
    insertToDB(req.body)
    .then(() => res.status(204).send())
    .catch(() => res.status(500).send());
});

【讨论】:

  • 如何更简洁明了? async..await 应该替换原始的 Promise,现在它们被带回来了。
  • “你应该等待”:这需要一个更有力的论据。
  • 是的,正如其他 cmets 所提到的,对所提出的观点没有任何解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多