首页 > 解决方案 > 当调用者不期望响应时使用`await`

问题描述

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

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。

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

编辑:这里有一个类似的问题。然而我认为这是不同的,因为我最感兴趣的是理解为什么删除await允许我每秒处理 2/3 倍的请求数。

标签: javascriptnode.jsexpressasynchronousasync-await

解决方案


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

您可以简单地使用承诺解决方案来更简洁明了:

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

推荐阅读