对 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 )
}))
您好,我在 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 )
}))