对 Express JS 的并发请求失败。需要解释发生了什么

Concurrent Requests to Express JS fails. Need Explanation what is happening

您好,我在 AWS Fargate 上有一个 expressjs 服务器 运行,它处理许多 API 对不同服务的调用,并将它们聚合成一个返回给客户端的响应。

我的问题是,我发现当我在大约同一时间收到对同一端点的请求时,这些请求中至少有一个会失败。这种行为非常奇怪,所以我需要一些帮助来解释正在发生的事情,并希望如何解决这个问题。

首先,这是我的路线设置方式的伪代码:

router.post( '/endpoint', async function (req, res, next) {
  try {
    let uId = req.body.uId
    let logId = req.body.logId

    let user = await axios(uId) //call to database to retrieve user information (appsync)
    console.log(logId, user)

    let data = []

    for (i = 0, i<user.accounts.length, i++) {
      if (user.accounts[i].provider === 'google') {
        let googleInfo = await axios(user.accounts[i]) // calls google API 
        console.log(logId, user.accounts[i], i , googleInfo)
        data.push(googleInfo)

      } else if (user.accounts[i].provider === 'microsoft') {
        let microsoftInfo = await axios(user.accounts[i]) // calls microsoft graph API
        console.log(logId, user.accounts[i], i , microsoftInfo)
        data.push(microsoftInfo)

      }
    }

    let response = processDataFunction(data) // some function that processes the data

    res.json(response)
  } catch (e) {
    next(e)
  }
})

这在只有一个请求时一切正常。但是,当有 2 个或更多个同时到达我们的端点时,服务器会返回 500 服务器错误,这就是我在 cloudwatch 日志中看到的内容。

dateTime1: request1, user: {}
dateTime2: request1, user.accounts[0], 0, googleInfo: {user.accounts[0]}
dateTime3: request1, user.accounts[1], 1, microsoftInfo: {user.accounts[1]}
dateTime4: request1, user.accounts[2], 2, googleInfo: {user.accounts[3]}
dateTime5: error ......
dateTime6: request2, user.accounts[0], 0, googleInfo: {user.accounts[0]}
dateTime7: request2, user.accounts[1], 1, microsoftInfo: {user.accounts[1]}
dateTime8: request2, user.accounts[2], 2, googleInfo: {user.accounts[2]}
dateTime9: request2, user.accounts[3], 3, googleInfo: {user.accounts[3]}

错误是由 microsoft/google 服务器出错引起的,因为我正在为 user.accounts[3] 请求资源,而循环和访问令牌仍在 user.accounts[2] 中(请参阅 dateTime4)

我可以通过增加 ECS 中 运行 任务的数量来部分解决这个问题。我最终能够同时处理更多并发请求。但是,在某个时刻,同样的错误仍然会出现。

任何解释为什么会发生这种情况,这是我增加 ECS 任务数量的唯一解决方法吗?

任何遇到同样问题的人。我仍然不知道发生了什么,但我能够通过将我所有的 for 循环变成:

来解决这个问题
Promise.all(arr.map( async(item) => { 
  return await axios( // request )
}))