【问题标题】:Not all SQS messages end up in Lambda: most just disappear并非所有 SQS 消息都在 Lambda 中结束:大多数都消失了
【发布时间】:2021-10-30 19:15:34
【问题描述】:

我有一个具有 Lambda 函数作为消费者的 AWS SQS 队列(标准,非 FIFO)。

每当我向队列发送一堆消息(通常一次大约 10 条)时,lambda 只接收大约 2 条消息(在 CloudWatch Logs 中验证)。其他人从队列中消失。

Lambda 批量大小设置为 1,因此我希望所有 10 条消息都位于队列中并被 Lambda 一条一条地拾取,但这并没有发生。我正在使用 CloudWatch 检查 Lambda 正在做什么,并且没有丢失消息的痕迹。

我在 Lambda 中通过记录 event.Records 数组的大小(始终为 1)验证它每次只收到一条消息。

队列还有一个死信队列。最初,Maximum Receives 设置为 1。当我将其增加到 3 时,队列 Visibility timeout 后接收到的消息更多,但仍然只有几条。

我的队列设置

  • 可见性超时:2 分钟
  • 交付延迟:0 秒
  • 接收消息等待时间:5 秒
  • 消息保留期:4 天
  • 最大消息大小:256kb

我想知道为什么这些消息没有被处理,而是消失了?

【问题讨论】:

  • documentation 建议:“为了让您的函数有时间处理每批记录,将源队列的可见性超时设置为您在函数上配置的超时的至少 6 倍。如果您的函数在处理前一批时您的函数执行受到限制,额外的时间允许 Lambda 重试。” Lambda 函数上设置的超时时间是多少?在 CloudWatch Logs 中,您是否看到消息失败并被发送到死信队列的原因?
  • Lambda 超时时间为 90 秒。所以我想我应该将可见性超时设置为 9 分钟?奇怪的是消息在 Lambda 中没有失败。每当 lambda 接收到一条消息时,我都会记录,而消失的消息也不会显示在日志中。
  • 通常,这类问题的答案是 Lambda 函数没有处理所有 event.Records 条目(很多人硬编码只处理第一条消息)。但是,您的情况似乎并非如此。您可以尝试断开 SQS 队列作为 Lambda 函数的触发器,以确认消息在队列中正确累积(并且没有其他任何东西在消耗它们)。
  • 我在我的测试队列中这样做了,当我向它发送 10 条消息时,所有 10 条消息都显示出来了。
  • 当您将一个 Lambda 函数连接到您的测试队列时,该函数是否接收到 所有 消息?您是否可以尝试暂时断开 Lambda 函数与非测试队列的连接,以查看消息是否都保留在队列中?因为一定有什么东西抓住了他们!

标签: amazon-web-services aws-lambda amazon-sqs


【解决方案1】:

原来这与 Lambda 函数的预留并发有关。我的并发设置为 1,这导致了问题。

我的期望 SQS 消息将保留在队列中,直到有可用的 Lambda 函数来提取它们。

现实中 由于函数被限制,并且在可见性超时之后未被 Lambda 拾取的消息被视为失败消息。

关于这个问题有一篇很棒的博文:https://data.solita.fi/lessons-learned-from-combining-sqs-and-lambda-in-a-data-project/

【讨论】:

    【解决方案2】:

    消息丢失的典型原因是 Amazon SQS 触发的 Lambda 函数未正确处理传递给函数的所有记录

    确保代码循环遍历传入 even 参数的所有 Records,因为在每个 Lambda 调用中可以提供多条消息。

    【讨论】:

    • 我现在正在这样做。然而,最初,我将 Lambda 函数的批量大小设置为 1,因此不需要遍历记录。
    猜你喜欢
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2013-10-02
    相关资源
    最近更新 更多