AWS Lambda 和 SQS:故障报告

AWS Lambda and SQS: failure reporting

这更像是一个“最佳实践”或“我做得对吗”的问题,但我无法在 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;
    }
}

问题:

  1. 如果成功,LambdaHandler 将只是 return null。它应该 return 还有什么吗?某种代码为 200 的 LambdaResponse?一些示例建议字符串“200 OK”,但这真的重要吗?

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

虽然我不喜欢这种方法。是否有其他方法 returning 某些值或以失败状态完成 lambda?某种代码为 500 的 LambdaResponse,它会通知 SQS 不要删除消息并 return 将它们排队?

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

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

If your function successfully processes the batch, Lambda deletes the messages from the queue. If your function is throttled, returns an error, or doesn't respond, the message becomes visible again. All messages in a failed batch return to the queue, so your function code must be able to process the same message multiple times without side effects.

来源:Using AWS Lambda with Amazon SQS

如果您不想多次重新处理邮件,我的建议是:

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

现在似乎支持使用来自 Lambda 的 SQS 消息时的部分失败:https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#services-sqs-batchfailurereporting