【问题标题】:AWS Lambda and SQS: failure reportingAWS Lambda 和 SQS:故障报告
【发布时间】: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;
    }
}

问题:

  1. 如果成功,LambdaHandler 只会返回 null。它应该返回其他东西吗?某种带有代码 200 的 LambdaResponse?一些例子提出了字符串“200 OK”,但这真的重要吗?

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

我不喜欢这种方法。是否有其他方法可以返回某个值或以失败状态完成 lambda?某种代码为 500 的 LambdaResponse,它会通知 SQS 不要删除消息并将它们返回到队列中?

【问题讨论】:

  • 在部分批处理失败的情况下,除了手动删除那些成功的消息并让其他消息的可见性超时并让 sqs 重新传递它们之外,别无他法。您可以更新失败消息的可见性超时,以便更快地发生可见性超时。或者,您必须以多次处理相同消息没有问题的方式构建代码/基础架构,例如因为它是后来失败的批次的一部分。不,没有返回值意味着什么。
  • 谢谢! ProcessMessages 方法已经处理了从 SQS 中删除已处理的消息,所以这部分我没有问题。我只是想知道是否有其他方法可以以其他/更优雅的方式完成 handleRequest 方法,然后在出现任何问题时抛出异常。

标签: java aws-lambda amazon-sqs


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    1. 不,您不需要返回任何特殊的东西。返回的数据仅与其他 Lambda 集成相关,例如与 API 网关结合使用。

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

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

    来源:Using AWS Lambda with Amazon SQS

    如果您不想多次重新处理消息,我对您的建议:

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

    【讨论】:

    • 谢谢,我确实做到了: - 处理所有消息,存储成功的信息 - 如果成功计数低于初始计数,则从 SQS 中删除所有成功消息并抛出异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 2019-07-01
    • 2020-06-14
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多