【问题标题】:AWS Lambda c# asynchronous API callsAWS Lambda c# 异步 API 调用
【发布时间】:2018-01-19 13:57:17
【问题描述】:

我有一个用 c# 编写的 AWS lambda 函数。该函数负责调用 5-6 个 API 调用(Post 请求)。

  1. 所有这些 API 调用都相互独立
  2. 我不关心这些 API 调用的响应
  3. 每个 API 调用大约需要 5 秒才能完成,即使我不关心后续响应。

问题: 我希望我的 lambda 函数在一秒钟内执行并响应。如何异步进行 API 调用,以便 lambda 函数可以在我的时间限制内完成所有这些,而无需等待 API 调用的响应?理想情况下,我想实现一个 Fire and forget API 调用系统,它可以毫不延迟地发回最终响应。

根据 AWS lambda documentation,我必须在 lambda 中将 await 运算符与异步调用一起使用,以避免在异步调用完成之前完成函数。

我在这里遗漏了什么吗?或者有没有办法做到这一点?

谢谢

【问题讨论】:

    标签: c# amazon-web-services lambda async-await aws-lambda


    【解决方案1】:

    如果你只想着火而忘记,那么不要使用 await。只需使用 HttpClient 方法(get、put 等)调用 API,就完成了。这些方法返回一个您不关心的Task<HttpResponseMessage>,因此您的 Lambda 可以在此时退出。

    【讨论】:

      【解决方案2】:

      您不能在无服务器请求的“外部”运行代码。尝试这样做只会带来痛苦 - 由于您的无服务器主机不知道您的代码不完整,因此可以随意终止您的托管进程。

      正确的解决方案是用队列分隔 两个 lambda。第一个(面向外部的)lambda 接受 POST 请求,在队列中丢弃一条消息,并将其响应返回给调用者。

      第二个(仅限内部)lambda 监视队列并执行 API 调用。

      【讨论】:

      • 或者第一个 Lambda 函数可以直接异步调用第二个函数……异步调用立即返回。这看起来更简洁,因为 Lambda 函数目前无法监控队列。
      • 是的,除非出现错误。在针对失败进行设计时,我更喜欢至少执行一次工作项。
      • 很难反驳。
      • @StephenCleary 您能否提供更多信息或有关“您无法在无服务器请求的“外部”运行代码”的链接。我的意思是,如果我的 AWS Lambda 进行 REST API 调用并需要等待答案,那没关系,不是吗?
      • @MattG:这是在 Lambda 处理 HTTP 请求的上下文中。 “您不能在无服务器请求之外运行代码”意味着“您的 lambda 代码必须在您返回响应之前完成运行”。这是因为您的 lambda 在发送 HTTP 响应后可能会被拆除。如果它进行另一个 API 调用,等待该调用的响应,然后发送自己的响应,则没有问题。如果 lambda 发送自己的响应并且 然后 尝试进行另一个 API 调用,则存在问题。
      【解决方案3】:

      对于您的用例,使用AWS Step functions 将提供完全托管的解决方案。步骤如下。

      1. 根据您是要并行触发还是逐个触发,定义您的 AWS 步进函数流。
      2. 将初始步骤与 API Gateway POST 方法集成。
      3. Step函数状态机启动后,会返回成功状态(立即不等待结束状态)

      与自定义 Lambda 流实施相比,Step 函数的优势很少。

      • 您可以配置为在各个步骤返回错误时重试每个步骤。
      • 如果任何步骤出现错误,您可以触发回调。
      • 您可以直观地识别和监控哪个步骤出现问题等。

      【讨论】:

        猜你喜欢
        • 2021-12-30
        • 2020-11-10
        • 2016-12-31
        • 2019-11-11
        • 2017-04-27
        • 2016-05-01
        • 2020-10-13
        • 2020-04-24
        • 2016-09-18
        相关资源
        最近更新 更多