aws-lambda - 处理由 BatchSize > 1 的 SQS 触发的 lambda 中的错误
问题描述
我设置了一个触发 lambda 函数的 AWS SQS 队列。作为默认行为,一次最多可以触发 10 条消息(默认 batchSize)。
如果 lambda 由于任何原因失败,它将失败整个批次并最终重试。但是假设我有一封发送 lambda 的电子邮件,它在前 N 个案例中成功执行,但在 N+1 中失败。如果它重试整个批次,它将重复电子邮件。
目前我只能想到将batchSize 1 来避免这个问题,但我希望能避免它。还有另一种方法吗?
节点代码非常简单,如下所示:
exports.handler = async event => {
try {
await Promise.all(
event.Records.map(async record => {
// SEND EMAIL ASYNC
});
);
} catch (error) {
[...];
throw error;
}
}
解决方案
解决此问题的一种方法是跟踪哪些消息成功和哪些失败(在您的 map 函数中完成),并在 catch 部分将失败的消息(可以通过 定位ReceiptHandle
)重新添加到队列中。然后不是抛出错误,而是成功返回,这将导致整个批次从队列中清除。
我相信删除成功的消息和抛出错误以使批处理的其余部分不会自动清除的deleteMessageBatch
相反ReceiptHandle
可能有效,但我没有尝试删除飞行中的消息。
来自https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html
当 Lambda 从队列中读取消息时,它会保留在队列中,但会隐藏,直到 Lambda 将其删除。如果您的函数返回错误,或者在队列的可见性超时之前未完成处理,则它会再次可见。
推荐阅读
- c++ - 为什么我们要向 ostream obj 发送 ref 到 ostream 重载?
- java - 对象添加到父类arraylist如何访问扩展函数
- mysql - MySQL 列显示另一个表中列的总和
- java - 从另一个布局提交按钮
- javascript - 获取显示在邮递员和 chrome 中永久发送请求的请求
- php - 管理员将产品下载链接更改为自定义链接
- capacitor - 来自电容相机的 GPS EXIF 数据
- php - 如何在html文档正文中删除样式标签
- python - 循环日期直到达到用户的要求
- javascript - 如何使用javascript检查和取消选中复选框组?