【问题标题】:Lambda function has fewer invocations than expectedLambda 函数的调用次数少于预期
【发布时间】:2019-11-17 04:50:15
【问题描述】:

我有一个这样的 Lambda 设置:

  1. 名为 getOrders() 的起始 lambda 连接到外部 API,获取当天的订单列表,并为彼此向主题发布 SNS 事件。
  2. SNS 主题正在被 SQS 队列订阅。
  3. 反过来,队列充当另一个名为 storeOrder() 的 lambda 函数的触发器。
  4. lambda storeOrder() 接收单个订单数据,连接到托管在 Atlas 上的 MongoDB 实例,并将订单存储在那里。

我希望getOrders() lambda 发送的订单数量会显示在最终的 MongoDB 数据库中,但事实并非如此。在我提供更多细节之前,让我明确一下,这是一个零流量的新帐户,这意味着没有其他 lambda 函数在运行。此外,我们处理的订单数量在 400 到 1200 之间,每天都在变化。在我测试时,这个数字大约是 450。

所以,我看到的是,如果我运行 getOrders() lambda,MongoDB 中只有 450 个订单中的 230 个。我最初以为是 Atlas 出事了,但 storeOrder() 中的监控选项卡只显示了 230 次调用。

我运行的另一个测试是批量发送 50 个订单事件,并添加 5 秒的延迟(通过 await 使用 setTimeout 函数)。在这种情况下,结果要好得多,因为 MongoDB 数据库中显示了大约 380 个订单。有时,我看到的订单比我发送的要多(可能是 SQS 在工作中的至少一次交付),但是使用相同的设置再次运行测试不会产生相同的结果,所以我只想提一下。

这迫使我得出结论,某处存在瓶颈,只是丢弃了消息。候选人是 SNS 和 SQS,但我不知道如何检查他们收到的事件/消息的总数等。

有人在 AWS Lambda 中遇到过类似情况吗?这可能是什么原因造成的?是否有任何我可能搞砸的设置导致了这种行为?我不知道如何解决这个问题!

【问题讨论】:

  • 大概getOrdersreadOrders 的拼写错误,反之亦然?此 Lambda 函数的 CloudWatch Logs 显示什么?您将不得不进行一些调试以确保如果它读取 N 个订单,那么它将所有 N 个发布到 SNS 主题。在进入工作流程的下一部分之前,请确保该部分正确无误。
  • @jarmod 是的,这是一个错字,谢谢!我修好了它。 readOrders() 的日志显示了预期内容:一些调用、总执行时间图等。我现在看到错误或失败。 “确保如果它读取 N 个订单,那么它将所有 N 个发布到 SNS 主题”——我同意我应该从这个开始。关于如何解决这个问题的任何建议?
  • 嗯,是您的代码读取订单并发布到 SNS,因此您可以添加调试日志以确保代码按预期运行。例如,如果您从 SNS API 调用中获得 OK 响应,那么这就是它成功的证据。增强您的 Lambda 的登录并在之后查看它。我指的是实际的低级日志,而不是高级指标。
  • storeOrder() 是从 SNS 接收单笔订单还是批量订单?您是否有可能收到一批但错误地将其作为单个订单处理,从而忽略了许多订单?
  • 您看到的症状最明显的原因是您的 storeOrder 代码无法识别正在发送一批订单,而只是处理一个订单而忽略了其他订单。如果订单通过 SQS,则将订单一一发送到 SNS 并不能保证它们一一到达您的最终 storeOrder Lambda 函数。他们可以分批。检查您的 storeOrder Lambda 收到的消息列表的长度。

标签: amazon-web-services aws-lambda


【解决方案1】:

这些症状表明您的storeOrder 代码正在发送一批订单,但它只处理该批次中的第一个订单,并且正在丢弃/忽略其他订单。

将订单一个一个发送到 SNS 并不能保证它们通过 SQS 将一个一个到达您的最终 storeOrder Lambda 函数。他们可以分批。检查storeOrder Lambda 收到的Messages 列表的长度。

请注意,SNS 将仅通过一条消息触发 Lambda,但 SQS 和 DynamoDB 可以通过一批消息触发 Lambda。您应该始终遍历消息列表,而不是假设该列表中只有一条消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2018-02-03
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    相关资源
    最近更新 更多