awslambda和sqs:故障报告

3lxsmp7m  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(415)

这更像是一个“最佳实践”或“我做得对吗”的问题,但我在网上找不到答案。我正在准备一个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。它还需要什么吗?有什么lambdaresponse代码是200?一些例子建议使用字符串“200ok”,但这真的重要吗?
如果发生故障, processMessages 将首先从sqs中删除已处理的消息,然后引发异常(batchprocessingfailure)。sqs不会收到任何响应,因此在可见性超时之后,它会将未处理的消息返回到队列(还配置了dlq)。
不过,我不喜欢这种方法。是否有其他方法返回某个值或以失败状态结束lambda?代码为500的某种lambdaresponse会通知sqs不要删除消息并将它们返回到队列吗?

4nkexdtk

4nkexdtk1#

不,你不需要归还任何特别的东西。返回的数据仅与其他lambda集成相关,例如与api gateway结合使用。
我认为没有比在出错时抛出异常更好的方法了。根据aws文件:
如果函数成功地处理了批处理,lambda将从队列中删除消息。如果函数被限制、返回错误或没有响应,则消息将再次可见。失败的批处理中的所有消息都返回到队列,因此函数代码必须能够多次处理同一消息而不会产生副作用。
来源:将aws lambda与amazon sqs结合使用
如果您不想多次重新处理邮件,我给您的建议是:
从队列中删除所有成功的消息(立即)。
如果一条或多条消息失败,请在lambda函数中引发异常。如果不抛出异常,lambda服务会认为一切正常,并从队列中删除批处理的所有消息—这不是您想要的。

相关问题