【发布时间】:2021-04-09 09:21:15
【问题描述】:
这更像是一个“最佳实践”或“我做得对吗”的问题,但我在 Internet 上的任何地方都找不到答案。 我正在准备一个 AWS Lambda (Java),它将由 SQS 事件触发。它将接收多达 10 个事件并进行处理。如果某些事件无法正确处理(依赖于外部服务),它将从 SQS 队列中删除已处理的事件。真的没有什么特别花哨的:) 问题是 - 如果批处理(部分或全部)失败,我应该如何完成 lambda 的执行。
Lambda 处理程序的代码如下所示:
public class LambdaHandler implements RequestHandler<SQSEvent, Void> {
private final CopierComponent copierComponent;
public LambdaHandler() {
this.copierComponent = DaggerCopierComponent.builder().build();
}
@Override
public Void handleRequest(SQSEvent sqsEvent, Context context) {
context.getLogger().log("entering the function");
copierComponent.ldpDynamoToEsCopier().processMessages(sqsEvent);
return null;
}
}
问题:
-
如果成功,LambdaHandler 只会返回 null。它应该返回其他东西吗?某种带有代码 200 的 LambdaResponse?一些例子提出了字符串“200 OK”,但这真的重要吗?
-
如果失败,
processMessages将首先从 SQS 中删除已处理的消息,然后引发异常 (BatchProcessingFailure)。 SQS 不会收到任何响应,所以在可见性超时后,它会将未处理的消息返回到队列中(也配置了 DLQ)。
我不喜欢这种方法。是否有其他方法可以返回某个值或以失败状态完成 lambda?某种代码为 500 的 LambdaResponse,它会通知 SQS 不要删除消息并将它们返回到队列中?
【问题讨论】:
-
在部分批处理失败的情况下,除了手动删除那些成功的消息并让其他消息的可见性超时并让 sqs 重新传递它们之外,别无他法。您可以更新失败消息的可见性超时,以便更快地发生可见性超时。或者,您必须以多次处理相同消息没有问题的方式构建代码/基础架构,例如因为它是后来失败的批次的一部分。不,没有返回值意味着什么。
-
谢谢! ProcessMessages 方法已经处理了从 SQS 中删除已处理的消息,所以这部分我没有问题。我只是想知道是否有其他方法可以以其他/更优雅的方式完成 handleRequest 方法,然后在出现任何问题时抛出异常。
标签: java aws-lambda amazon-sqs