【问题标题】:How can aws api gateway listen to 2 lambda functions?aws api 网关如何监听 2 个 lambda 函数?
【发布时间】:2018-05-30 17:48:18
【问题描述】:

我的设计是api会触发第一个lambda函数,这个函数然后发送sns并返回,sns触发第二个lambda函数。现在我希望 api 从第二个 lambda 函数获得响应。

这是流程: api获取用户的请求然后触发第一个lambda函数,第一个lambda函数创建一个sns并返回。现在 api 处于 lambda 函数阶段,仍在等待第二个 lambda 的响应。 sns 触发第二个 lambda 函数;第二个 lambda 函数返回一些结果并将其传递给 api。 api 获取响应并将其发送回用户。

我知道有一种方法可以使用 sdk 来获取第二个 lambda 函数并设置事件类型以使其异步。但是这里我想用sns,可以吗?

需要一些帮助/建议。提前致谢!

【问题讨论】:

  • 恐怕这个设计有一个严重的缺陷。 SNS invokes Lambda asynchronously 并且没有捕获任何结果——它被丢弃了。如果您需要 Lambda 函数的结果,则需要同步调用它,以便调用者阻塞等待响应。
  • 正如@Michael-sqlbot 已经提到的,SNS 将无法获得调用的结果,因此您的第一个 Lambda 将无法知道第二个 Lambda 的结果。
  • 另外,SNS 可能会多次调用您的第二个 Lambda。

标签: node.js amazon-web-services lambda amazon-sns


【解决方案1】:

当然可以。 Lambda 为您提供了一种实现几乎任何您想要的任意功能的方法,无论是将记录插入到您的 DynamoDB、从 S3 存储桶中读取对象、计算电子商务网站上选定项目的税额,还是只是调用一个 API。
请注意,在这里您不需要任何事件来从 lambda 调用您的 api,因为您只需直接调用 api。
当您使用 Node 时,您可以简单地使用 http 请求;像这样:

var options = {
  host: YOUR_API_URL,
  port: 80,
  path: 'REST_API_END_POINT',
  method: 'YOUR_HTTP_METHOD' //POST/GET/...
};

http.request(options, function(res) {
  //Whatever you want to do with the reply...
}).end();

【讨论】:

  • 你又在调用 api,那不是我想要的。 api 已经通过请求阶段,现在正在等待 lambda 响应。现在不是从第一个 lambda 函数获取响应,而是希望 api 从第二个 lambda 函数获取响应,然后进入响应阶段并将响应发送给用户。
【解决方案2】:

以下是可能解决您的问题的方法,但需要轮询。

API GTW

集成到 --> Lambda1

Lambda1

  1. create unique sha 在bucket 中创建一个文件夹say s3://response-bucket/
  2. 通过 sdk 触发 SNS,有效载荷具有 sha
  3. 从密钥 s3://response-bucket/ 轮询(设置了超时)
  4. 如果放置了结果,则从 Lambda1 发回响应 --> ApiGTW
  5. 如果超时则返回错误。

如果成功,则触发 SNS 以清除存储桶中的响应数据,其负载为 SHA,将由另一个 lambda 清除。

社交网络

现在 SNS 中有带有 SHA 的有效负载

Lambda2

  1. SNS 触发 lambda2
  2. 从负载中提取唯一的 sha
  3. lambda 结果放在同一个 s3://response-bucket/
  4. 从 lambda2 退出

【讨论】:

    【解决方案3】:

    您需要与 lambda_func_1 共享 lambda_func_2 的返回,api 网关请求上下文仅在您在 func1 上调用 callback 时返回,您无法保存或将 request contex 发送到另一个 lb_func。 对于这种情况,我的解决方案是使用 Dynamodb(或每个数据库)来共享 f2 的结果。

    F1 向 sns 发送数据,日期包括 transactionID 之类的键(uuid 或时间戳)。然后“等待”直到 F1 收到表中的结果(例如:tbl_f2_result)并使用结果执行callback 函数。也许用transactionID查询直到你收到数据或者只尝试10次(一次超时2s,最坏的情况下你会等待20秒)

    F2 已被 SNS 触发,对包含transactionID 的数据进行处理,然后使用transactionID => @987654329 将结果(成功与否,错误消息...)插入结果表(tbl_f2_result) @,回调完成F2。

    transactionID是表的索引键:D

    您必须增加 F1 的超时时间 - 默认为 6 秒。

    【讨论】:

      猜你喜欢
      • 2018-09-11
      • 2022-01-27
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 2017-07-26
      相关资源
      最近更新 更多