【发布时间】:2019-11-17 04:50:15
【问题描述】:
我有一个这样的 Lambda 设置:
- 名为
getOrders()的起始 lambda 连接到外部 API,获取当天的订单列表,并为彼此向主题发布 SNS 事件。 - SNS 主题正在被 SQS 队列订阅。
- 反过来,队列充当另一个名为
storeOrder()的 lambda 函数的触发器。 - 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 中遇到过类似情况吗?这可能是什么原因造成的?是否有任何我可能搞砸的设置导致了这种行为?我不知道如何解决这个问题!
【问题讨论】:
-
大概
getOrders是readOrders的拼写错误,反之亦然?此 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