【问题标题】:Orchestrating AWS lambda functions编排 AWS lambda 函数
【发布时间】:2018-06-03 10:23:37
【问题描述】:

背景

我有一个 API 网关端点,它代理 Lambda 函数 (Lambda A),供我的 React 应用程序获取客户数据。

这个 lambda 函数调用 API 来获取客户数据,但是响应的格式还有很多不足之处。所以我想重新格式化它。

我没有将这种重新格式化的逻辑填充到 Lambda A 中,而是编写了一个单独的 Lambda 函数 (Lambda B)。当我的 API Gateway 端点被命中时,我需要调用这两个函数,并且第一个的输出是第二个的输入。

第一个想法:Step Functions

Step 函数看起来很自然,但可以在阶段之间传递的数据负载大小有 32kb 的限制。我们的客户数据 json blob 经常超过这个值。

我听说过针对这种情况的唯一“最佳实践”是将有效负载写入 S3,然后将对象密钥传递到下一阶段。

这很好,但我对不得不向 S3 写入和删除这么多短期对象并不感到兴奋。每天可能有数十或数十万个这样的请求。所以我已经放弃了阶梯函数方法(现在)。

当前方法

我目前正在使用 javascript SDK 直接从 Lambda A 调用 Lambda B。这有相当多的缺点。值得注意的是,我有时会同时运行两个 lambda,而没有性能优势。换句话说,我付钱让 Lambda A 坐在那里等待来自 Lambda B 的响应(我也为此付费)。

感觉像是一种反模式,我听说它是​​这样描述的。

问题

这似乎是一个相对常见的场景 - 进行 API 调用(函数 A),然后执行一些额外的逻辑来补充、重新格式化或以其他方式修改该响应(函数 B),然后将其传递回调用者。

当然,我不是第一个想要使用两个 Lambda 函数来做这种事情的人。

  • 假设我不能使用阶跃函数,我有哪些选择可以使用两个 lambda 函数执行此操作?

  • 除了使用 S3 之外,还有其他方法可以解决 Step Functions 的 32kb 有效负载大小限制吗?

  • 如果我想避免使用 S3/Step Function 方法是愚蠢的,那么也欢迎解释为什么我的担忧没有根据的答案。

编辑

您为什么还要考虑将获取数据和处理数据的功能拆分为两个不同的 AWS Lambda 函数?

想象一下,我有两打 Lambda 需要使用 Lambda B 的功能,而不仅仅是 Lambda A。

所以,我将 Lambda B(的功能)打包,发布到 Nexus,而我的另外两打 Lambda 都在构建时使用它。我所有的 lambdas 的大小都在膨胀,当我积累更多的“Lambda B”时,我必须发布更多的 npm 包。这是我想要避免的。

我希望我的“Lambda A”使用其他 lambda,而不是 npm 包,以实现广泛共享的功能。也许我在字面上理解“lambda 函数”中的“函数”,或者我只是想充分利用 FaaS 的潜力。

【问题讨论】:

  • 您的要求甚至是对请求的同步响应吗?我想知道这将如何与 Step Functions 一起使用,除非您从 AWS Lambda 函数中触发 Step Function,这将导致与触发 AWS Lambda 函数相同的缺点。
  • 是的,它是同步的,因为 Lambda B 在 Lambda A 完成之前无法启动,调用者需要 Lambda B 的计算结果。不需要 lambda 来触发 step 函数; API Gateway 可以直接执行此操作。 step 函数将依次依次执行两个 lambdas,将 Lambda B 的结果返回给调用者。
  • 当直接通过 API Gateway 触发 Step Function 时,您不只是在响应中获取执行的 ARN,而不是 Step Function 的结果吗?至少 docs.aws.amazon.com/step-functions/latest/dg/… 是这么建议的。
  • @Dunedan 很棒的评论 - 你是绝对正确的。步进函数不适用于我的用例,不是因为任何数据限制,而是因为它们的异步性质。 the workarounds 没有一个很有吸引力。对于未来的读者,this take on step functions 很好地解释了我 希望 摆脱阶跃函数的内容。再次感谢您的宝贵意见。

标签: javascript amazon-web-services aws-lambda aws-api-gateway aws-step-functions


【解决方案1】:

从您的问题中,我可以阅读以下要求:

  • 您需要一个 AWS Lambda 函数(位于 API Gateway 后面)作为客户端应用程序的 API 端点
  • 您的 AWS Lambda 函数必须从后端系统获取数据并对其进行处理以供客户端应用程序使用
  • 此类请求是同步的,响应速度越快越好(当然也更便宜)
  • 您需要运行的逻辑并不太复杂,可能只需几毫秒即可执行

您为什么还要考虑将获取数据和处理数据的功能拆分为两个不同的 AWS Lambda 函数?不要把“AWS Lambda 函数”中的“函数”看得太直白:您在 AWS Lambda 函数中运行的代码可以尽可能复杂。只需在单个 AWS Lambda 函数中运行所有内容并按逻辑拆分代码。这是最有效和最干净的方式。

【讨论】:

  • 这是合理的输入,我很感激。将这两个功能浓缩为一个当然是我考虑的第一件事,而且我最终可能会这样做。但是,我相信我有充分的理由探索将它们分开的选择,这就是我试图解决这个问题的原因。尽管如此,还是要为“这个答案很有用”投票。
【解决方案2】:

您没有说明进程 A 和 B 之间的有效负载有多大。但如果它低于 250Kb,我建议设置一个中间 SQS 队列,其中进程 A 发布结果,进程 B 由队列中的新消息触发。

【讨论】:

    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    相关资源
    最近更新 更多