AWS Lambda和SQS:故障报告



它更像是一个"最佳实践";或";我做得对吗;问题,但我在网上找不到答案。我正在准备一个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;
}
}

问题:

  1. 如果成功,LambdaHandler将只返回null。它还应该退货吗?某种代码为200的LambdaResponse?一些例子提出了字符串";200 OK";,但这真的重要吗?

  2. 如果失败,processMessages将首先从SQS中删除已处理的消息,然后引发异常(BatchProcessingFailure(。SQS不会收到任何响应,因此在可见性超时后,它会将未处理的消息返回到队列(也配置了DLQ(。

不过我不喜欢这种方法。有没有其他方法可以返回一些值或以失败状态结束lambda?某种代码为500的LambdaResponse,会通知SQS不要删除消息并将其返回队列吗?

现在似乎支持在使用Lambda的SQS消息时出现部分故障:https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#services-sqs批处理故障报告

  1. 不,您不需要返回任何特别的东西。返回的数据仅与其他Lambda集成相关,例如与API网关组合。

  2. 我认为没有比在出现错误时抛出异常更好的方法了。来自AWS文档:

如果您的函数成功处理了批处理,Lambda将从队列中删除消息。如果您的函数被抑制、返回错误或没有响应,则消息将再次可见。失败批处理中的所有消息都会返回队列,因此您的函数代码必须能够多次处理同一消息而不会产生副作用。

来源:使用AWS Lambda和亚马逊SQS

如果你不想多次重新处理消息,我给你的建议是:

  1. 从队列中删除所有成功的消息(立即(
  2. 如果一条或多条消息失败,请在Lambda函数中引发异常。如果你不抛出异常,Lambda服务会认为一切都很好,并从队列中删除该批的所有消息——这不是你想要的

最新更新