【问题标题】:Invoke an aws lambda function from another function with SQSEvent object使用 SQSEvent 对象从另一个函数调用 aws lambda 函数
【发布时间】:2020-10-04 04:17:53
【问题描述】:

我有一个用 java 编写的 lambda 函数,其句柄方法签名为:

public String handleRequest(SQSEvent sqsEvent, Context context){ //Todo }

我的 lambda 函数接受 SQS 事件作为请求并处理逻辑。

如果我的 lambda 函数以某种方式失败,我想通过手动提供所需的输入数据再次触发它。 我的方法是创建一个新的 lambda 函数,它将调用我的主 lambda 函数。我将使用带有所需参数的 APIGateway 触发我的新 lambda。

我们如何创建自己的 SQS 事件对象以将其作为请求主体传递给我的主 lambda? SQSEvent对象需要哪些参数和结构?

谢谢!

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-sqs


    【解决方案1】:

    有很多事情需要考虑:

    1. 默认情况下,Lambda 会重试几次失败的调用

    2. 如果 SQS 是您的事件源,则消息将保留在那里,直到您将其从代码中的队列中删除。如果您的函数失败并且没有删除该消息,它将在可见性超时到期后恢复

    3. 如果事件一直导致重复失败,将其反馈给函数将没有用,并且会导致无限循环

    对于这种情况,建议设置DLQ,这样您就可以隔离始终失败的消息。

    现在,您的处理性质有可能使重试变得安全,而不必担心无限循环,在这种情况下,您可以编写一个函数,该函数将从 DLQ 中提取消息并将它们反馈回主队列,无需直接调用“main” lambda。但话虽如此,我会非常仔细地查看最终以 DLQ 结尾的消息,它们可能表明您的代码中存在一些处理错误。

    【讨论】:

    • 谢谢@Oleksii!就像你说的代码中可能存在错误。这就是为什么我们要在修复它之后手动触发 lambda。使用将 JSON 对象作为输入而不是 SQSEvent 对象的新处理程序创建“主”lambda 的别名/版本是否很好?基本上,我只会传递我们代码中需要的那些字段。此外,我们能否将重试限制为 3-4 次,然后再将失败的事件移至 DLQ?
    • @viruKundral SQS 重新驱动策略允许您指定消息在重新驱动到 DLQ 之前将出现在主队列中的次数。至于其他问题,不知道你的设置很难说
    • 我们没有从其他 lambda 调用我们的主 lambda 函数,而是在我们的主 lambda 中创建了一个新的处理程序方法并将其作为它的别名执行。但是感谢您对 DLQ 和重试的想法。真的很有帮助!
    猜你喜欢
    • 2018-08-21
    • 2018-05-19
    • 2018-06-09
    • 2021-09-23
    • 1970-01-01
    • 2022-12-05
    • 2019-06-28
    • 2017-01-01
    相关资源
    最近更新 更多