【问题标题】:Calling Proxy lambda from another lambda从另一个 lambda 调用代理 lambda
【发布时间】:2021-05-12 21:22:45
【问题描述】:

我们正在使用 AWS 设计无服务器服务。

整体结构是API-gateway -> lambda [L1] -> kinesis -> backend

API 网关 -> lambda L1 是代理模式。即 APIG 会将整个有效负载传输到 lambda,包括客户端帐户 ID 等上下文

我们希望在内部有一个重试策略,以防后端处理由于某种原因失败。对于内部重试机制,我们想用相同的请求再次触发 lambda L1。

为此,我们考虑了以下解决方案:

每当由于 API 网关请求触发 lambda L1 时,我们会将整个请求存储在 S3 中。在重试期间,我们将有一个单独的重试 lambda L2,它从 s3 下载相同的请求,读取它并触发具有相同有效负载的 lambda L1 我们考虑了以下方法: 我们可以通过传递存储在 S3 中的整个 json 有效负载直接使用Invoke API。 考虑到 lambda L1 是否以代理模式连接到 API 网关,所以这项工作是否只有一个触发器? 这种方法有什么挑战吗?

这是推荐的方式还是有其他更好的方式?

【问题讨论】:

  • 请求事件有多大?也许您可以将其存储在 sqs 中,而不是 s3 中。 SQS 可以有死信队列,您可以自动处理并收到有关未能成功处理的事件的通知。
  • 我的用例是这样的,后端处理中可能会发生故障,因此这些故障不会被使用 DLQ 捕获。

标签: amazon-web-services aws-lambda aws-api-gateway


【解决方案1】:

你应该选择这样的死信队列 https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#dlq

如果您想确保一切都进入 kinesis,您可以在 APIGW -> SNS -> (async) Lambda with Dead Letter Queue -> Kinesis 之间添加一些东西。

这里有一个很好的解释: https://aws.amazon.com/blogs/compute/designing-durable-serverless-apps-with-dlqs-for-amazon-sns-amazon-sqs-aws-lambda/

【讨论】:

  • 我想重试后端而不是 lambda 中的失败。因此为 lambda 配置 DLQ 并不能解决问题。
【解决方案2】:

听起来我们需要存储传入的请求,以便在返回错误时重新应用它们。

  • 我们可以使用设置的 ttl 代理来自 Api Gateway to DynamoDB 的事件。假设您的后端可能会在 1 小时内失败,我们可以将 ttl 设置为 1 小时,因此,事件将在 1 小时后被删除。
  • 启用 Dynamo Steams 并创建一个 Lambda 来使用事件。
  • 当后端失败时,将 dynamo 记录更新为触发更新并调用 lambda 的某个状态。

根据记录大小(如果大于 400 KB 超过 Dynamo 限制),我们可以从 Api Gateway 对 S3 进行类似的代理,并根据 S3 事件使用 Lambda。

【讨论】:

    猜你喜欢
    • 2019-12-15
    • 2016-12-31
    • 1970-01-01
    • 2022-12-05
    • 2021-11-04
    • 2021-06-02
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多