【问题标题】:How to space apart retries of consumer/lambda processing of SQS message to being 10 hours apart如何将 SQS 消息的消费者/lambda 处理的重试间隔为 10 小时
【发布时间】:2021-04-25 02:58:56
【问题描述】:

我想了解消费者消息处理尝试可以间隔多长时间的限制。例如,假设我有以下 AWS 资源

  • SQS 队列(名为“SQSQueueName1”)w/redrive 配置为向 SQSQueueName1DLQ 发送死信消息
  • SQS 队列 DLQ(名为“SQSQueueName1DLQ”)
  • Lambda 函数(名为“LambdaName1”)

如果 SQSQueueName1 具有将 MaxRecieveCount 设置为 10 的重新驱动策略,那么在这种情况下,消费者处理此消息的尝试间隔多长时间?我对消费者尝试之间的持续时间有任何控制吗?例如,我可以将它们分开,以便在 10 小时内进行尝试吗?或者这个控制完全不存在,以至于所有控制都被委托给 lambda 轮询器和 sqs 之间的协商(使用可见性超时 + 重新驱动)?

再次,我的目标是看看在技术上是否可以将调用之间的时间量控制在设定的时间量内,比如 10 小时。 24 小时。

【问题讨论】:

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


    【解决方案1】:

    SQS 队列具有 messageVisibilityTimeout 参数,可以准确控制您想要的内容。它设置为持续时间,最大值为 12 小时。消息被消费者读取后,在messageVisibilityTimeout 期间,其他任何人都看不到该消息。因此,如果您将其设置为 10 小时,则您的消息将仅在 10 小时后重试。

    Lambda 触发器与此参数完全无关。当您使用 SQS 触发 Lambda 函数时,Lambda 会对 SQS 队列进行长时间轮询,换句话说,不断请求新消息。但是,无论 Lambda 向 SQS 发出多少请求,如果消息不可见,Lambda 都不会读取它。

    【讨论】:

    • 那么如果第一个 lambda 调用失败,并且将 maxReceiveCount 设置为 2 并将 messageVisibilityTimeout 设置为 10 小时,那么消息将保持 10 小时不可见,这样两次 lambda 调用将相隔 10 小时?跨度>
    • 我可能只是在了解这个细节,但听起来如果第一次 lambda 调用失败,由于缺少 lambda 而没有删除它,消息在队列中只是保持不可见。基于 messageVisibilityTimeout 的不可见持续时间。
    • @jbooker 死信队列仅在接收到 maxReceiveCount 次(在您的示例中为 2)时使用。这与 messageVisibilityTimeout 完全不同。如果您希望消息转到 DLQ,然后延迟 10 小时重试,那么您应该构建一个更复杂的机制。我警告你,这是一种反模式。最好仅将 DLQ 用于常规消费者无法处理且需要手动处理的消息。
    猜你喜欢
    • 2020-11-11
    • 2019-06-10
    • 2016-05-04
    • 2017-07-18
    • 2020-12-07
    • 2020-08-30
    • 2019-10-09
    • 2019-10-03
    • 1970-01-01
    相关资源
    最近更新 更多