Amazon web services Lambda函数的调用少于预期

Amazon web services Lambda函数的调用少于预期,amazon-web-services,aws-lambda,Amazon Web Services,Aws Lambda,我有一个Lambda设置,如下所示: 名为getOrders()的起始lambda连接到外部API,获取当天的订单列表,并为彼此发布主题的SNS事件 SNS主题由SQS队列订阅 反过来,队列充当另一个名为storeOrder()的lambda函数的触发器 lambdastoreOrder()接收单订单数据,连接到Atlas上托管的MongoDB实例,并将订单存储在那里 我希望从getOrders()lambda发送的订单数量会显示在最终的MongoDB数据库中,但事实并非如此。在我提供更多细节之

我有一个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秒的延迟(通过
    wait
    ing
    setTimeout
    函数)。在这种情况下,结果要好得多,因为MongoDB数据库中显示了大约380个订单。偶尔,我会看到比我发送的订单更多的订单(可能SQS至少有一次在工作中交付),但是使用相同的设置再次运行测试不会产生相同的结果,所以我只想提到这一点

    这迫使我得出结论,在某个地方存在一个瓶颈,就是简单地丢弃消息。候选对象是SNS和SQS,但我不知道如何检查他们收到的事件/消息的总数,等等


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

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

    将订单逐个发送到SNS并不能保证如果通过SQS,它们将逐个到达您的最终
    storeOrder
    Lambda功能。它们可以分批处理。检查
    storeOrder
    Lambda收到的
    消息的长度


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

    症状表明您的
    storeOrder
    代码正在发送一批订单,但它只处理该批订单中的第一批订单,并删除/忽略其他订单

    将订单逐个发送到SNS并不能保证如果通过SQS,它们将逐个到达您的最终
    storeOrder
    Lambda功能。它们可以分批处理。检查
    storeOrder
    Lambda收到的
    消息的长度


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

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