我有一个Lambda设置,如下所示:
getOrders()
的起始lambda连接到外部API,获取当天的订单列表,并互相获取日期,将SNS事件发布到该主题。storeOrder()
的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中遇到过类似情况吗?是什么原因造成的?是否有任何我可能搞砸的设置,导致这种现象?我不知道如何解决这个问题!
答案 0 :(得分:2)
症状表明正在向您的this.client.watchQuery
代码发送一批订单,但它仅处理该批次中的第一个订单,而放弃/忽略其他订单。
向SNS一对一发送订单并不能保证它们通过SQS会一一到达您的最终storeOrder
Lambda函数。他们可以分批。检查storeOrder
Lambda收到的Messages
列表的长度。
请注意,SNS仅会用一条消息触发Lambda,但是SQS和DynamoDB可以用一批消息触发Lambda。您应该始终遍历邮件列表,而不是假定该列表中仅一封邮件。