Lambda函数的调用少于预期的

时间:2019-11-16 16:28:25

标签: amazon-web-services aws-lambda

我有一个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中遇到过类似情况吗?是什么原因造成的?是否有任何我可能搞砸的设置,导致这种现象?我不知道如何解决这个问题!

1 个答案:

答案 0 :(得分:2)

症状表明正在向您的this.client.watchQuery代码发送一批订单,但它仅处理该批次中的第一个订单,而放弃/忽略其他订单。

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

请注意,SNS仅会用一条消息触发Lambda,但是SQS和DynamoDB可以用一批消息触发Lambda。您应该始终遍历邮件列表,而不是假定该列表中仅一封邮件。