AWS Lambda 直接调用发送两个即时响应
AWS Lambda direct invocation sends two immediate responses
我有一个使用 lambda.invoke 通过 AWS SDK 触发的 lambda 函数,它每次都会发送具有相同请求 ID 的重复请求。目前 运行 NodeJS 与 AWS 中的 lambdas。
- AWS 开发工具包版本 2.557.0
- NodeJS 版本 10
我尝试将 AWS 客户端配置为 maxRetries 为 0,httpOptions 超时为 30000,connectTimeout 为 10000。
AWS.config.update({
maxRetries: 0,
httpOptions: {
timeout: 30000,
connectTimeout: 10000
}
})
正在调用 lambda.invoke,内容如下:
const result = await lambda.invoke({
FunctionName: process.env.INTAKES_FUNCTION_NAME,
Payload: JSON.stringify(intakesEvent)
}, function(err, data) {
if (err) {
console.log(`Lamda Error: ${JSON.stringify(err, null, 2)}`)
throw err;
} else {
console.log('Lambda Result: ' + data);
}
}).promise();
我确定调用发生了,因为我可以在 Cloudwatch 中看到日志。但是,我看到调用 lambda.invoke 的函数中的日志只出现一次,而调用的 lambda 函数中的日志出现两次。 AWS SDK 分配的请求 ID 相同。
我做了一些研究并得出结论,需要解决幂等性问题,但我不明白为什么 100% 的时间都会发生这种情况。 Cloudwatch 和 Lambda 日志显示 0% 的错误,没有任何超时,但是在 20 - 50 毫秒的差异内使用 lambda.invoke 触发了两个重复的请求。我遇到的其他帖子表明他们遇到过这种情况,重复事件之间有 10 分钟的延迟。
有没有人遇到过这种情况?
[回答]
根据以下 Arun K 的回答:
const result = await lambda.invoke({
FunctionName: process.env.INTAKES_FUNCTION_NAME,
Payload: JSON.stringify(intakesEvent)
}).promise();
问题是回调和 promise 语法混合导致了某种双重触发。修复此问题消除了双重立即重试问题。
我能看到的唯一问题是,您混合了承诺和回调语法。修复该问题后,您应该能够从 lambda 中看到实际错误。
try {
const result = await lambda.invoke({
FunctionName: process.env.INTAKES_FUNCTION_NAME,
Payload: JSON.stringify(intakesEvent)
}).promise();
} catch (err) {
console.log('error: ', err)
}
我有一个使用 lambda.invoke 通过 AWS SDK 触发的 lambda 函数,它每次都会发送具有相同请求 ID 的重复请求。目前 运行 NodeJS 与 AWS 中的 lambdas。 - AWS 开发工具包版本 2.557.0 - NodeJS 版本 10
我尝试将 AWS 客户端配置为 maxRetries 为 0,httpOptions 超时为 30000,connectTimeout 为 10000。
AWS.config.update({
maxRetries: 0,
httpOptions: {
timeout: 30000,
connectTimeout: 10000
}
})
正在调用 lambda.invoke,内容如下:
const result = await lambda.invoke({
FunctionName: process.env.INTAKES_FUNCTION_NAME,
Payload: JSON.stringify(intakesEvent)
}, function(err, data) {
if (err) {
console.log(`Lamda Error: ${JSON.stringify(err, null, 2)}`)
throw err;
} else {
console.log('Lambda Result: ' + data);
}
}).promise();
我确定调用发生了,因为我可以在 Cloudwatch 中看到日志。但是,我看到调用 lambda.invoke 的函数中的日志只出现一次,而调用的 lambda 函数中的日志出现两次。 AWS SDK 分配的请求 ID 相同。
我做了一些研究并得出结论,需要解决幂等性问题,但我不明白为什么 100% 的时间都会发生这种情况。 Cloudwatch 和 Lambda 日志显示 0% 的错误,没有任何超时,但是在 20 - 50 毫秒的差异内使用 lambda.invoke 触发了两个重复的请求。我遇到的其他帖子表明他们遇到过这种情况,重复事件之间有 10 分钟的延迟。
有没有人遇到过这种情况?
[回答] 根据以下 Arun K 的回答:
const result = await lambda.invoke({
FunctionName: process.env.INTAKES_FUNCTION_NAME,
Payload: JSON.stringify(intakesEvent)
}).promise();
问题是回调和 promise 语法混合导致了某种双重触发。修复此问题消除了双重立即重试问题。
我能看到的唯一问题是,您混合了承诺和回调语法。修复该问题后,您应该能够从 lambda 中看到实际错误。
try {
const result = await lambda.invoke({
FunctionName: process.env.INTAKES_FUNCTION_NAME,
Payload: JSON.stringify(intakesEvent)
}).promise();
} catch (err) {
console.log('error: ', err)
}