【问题标题】:How do you force AWS lambda trigger off of SQS consistently?您如何始终强制 AWS lambda 触发 SQS?
【发布时间】:2019-06-29 14:22:28
【问题描述】:

我们注意到,在设置 AWS lambda 以从 SQS 触发时,很多时候触发会发生几分钟,有时甚至会延迟一小时才能触发。我知道 AWS lambda 会在内部进行轮询,当队列为空时,它可能会进行一些指数退避。

但是,我们有一个调度程序,它每 30 分钟运行一次并将数据推送到队列中。但是,对于 % 的消息,lambda 的触发要晚得多。我们的业务要求它在一分钟内触发。

有没有办法强制 lambda 始终检查队列?另一种方法是使用步进函数,但由于此线程中的另一个答案,这是不可能的 --> How do you run functions in parallel?

我也在考虑将数据推送到 s3 并从 s3 异步触发 lambda 触发器而不是被轮询,但是当我们想要推送大量记录时,s3 没有批处理 api,所以就这样了。

【问题讨论】:

  • 您看到的随机延迟可能是由于帐户或 lambda 本身的并发限制。我使用 SQS 触发器已经有一段时间了,老实说,我从来没有经历过超过几秒的延迟。您是否研究过 CloudWatch 指标,特别是 lambda 并发?
  • 刚刚检查过。指标显示最大值为 100。我的限制为 5000。
  • hmmm 我很难相信触发器需要长达一个小时,所以当您已经确认它不是并发问题时。您的 SQS 队列中有任何自定义配置吗?你怎么知道有延迟?您是否记录了将消息推送到 SQS 的时间,并且您是否在延迟期间检查了 Lambda CloudWatch?有什么活动吗?
  • 如果我在安静的时间发布消息,那么我会收到消息。

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


【解决方案1】:

原来是在使用 AWS SDK 时错误地使用了 async/await。他们只支持 .promise()。这就是并非所有消息都以 sqs 结尾的原因。

希望它可以帮助其他人。 AWS 正在开发一个支持 async/await 的新 sdk。这是他们的链接 https://github.com/aws/aws-sdk-js-v3/issues/153#issuecomment-457769969

【讨论】:

    【解决方案2】:

    我会检查以确保 SQS 是长拉还是短拉。

    “在几乎所有情况下,Amazon SQS 长轮询比短轮询更可取。长轮询请求让您的队列使用者在消息到达您的队列时立即接收消息,同时减少返回的空 ReceiveMessageResponse 实例的数量。

    在大多数使用案例中,Amazon SQS 长轮询会以更低的成本获得更高的性能。但是,如果您的应用程序期望 ReceiveMessage 调用立即响应,那么您可能无法在不对应用程序进行一些修改的情况下利用长轮询。

    例如,如果您的应用程序使用单个线程轮询多个队列,从短轮询切换到长轮询可能不起作用,因为单线程将等待任何空队列上的长轮询超时,从而延迟处理任何可能包含消息的队列。

    在这样的应用程序中,使用单个线程仅处理一个队列是一种很好的做法,从而允许应用程序利用 Amazon SQS 长轮询提供的优势。”

    另外,如果您希望启动您的 lambda 函数,您能否为您的 SQS 设置一个 SNS 通知系统?类似于 SQS SNS Lambda 的东西。这应该会让您分分钟,并且您不会不断地排队等待消息。您只需在 SNS 上进行即可。

    https://aws.amazon.com/sqs/faqs/

    【讨论】:

    • OP 正在使用 SQS Lambda 触发器,因此应用程序轮询无关紧要。 AWS Lambda 服务代表客户进行长轮询。
    • 我的并发勉强达到 100,我的未预留限制也提高到了 5000。没有变化,仍然看到延迟。我认为这可能是因为队列在 30 分钟中有 28 分钟是空的,所以 lambda 不会立即轮询。不确定。
    • @TimJohnson 没有任何关于 Lambda 在安静时间不轮询队列的记录,但是有一个名为 NumberOfEmptyReceives 的 SQS 指标将显示轮询是否确实发生 - 每次轮询完成时它都会增加没有找到任何可见的消息。
    • 谢谢。我会看看。我已经看到文档谈到在安静时间特别是并发延迟时点被延迟
    猜你喜欢
    • 2019-05-14
    • 2020-05-17
    • 1970-01-01
    • 2020-07-28
    • 2021-03-28
    • 1970-01-01
    • 2018-03-01
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多