【问题标题】:AWS SQS messages does not become available again after visibility timeoutAWS SQS 消息在可见性超时后不再可用
【发布时间】:2022-01-20 05:39:44
【问题描述】:

这很可能是非常简单的事情,但由于某种原因,我的 SQS 消息在可见性超时后不再可用。至少这是我的想法,因为使用 lambda 没有任何日志条目表明已触发任何重试。

我的用例是另一个 lambda 为 SQS 队列提供 JSON 实体,然后需要转发。有时要发送的数据太多以至于接收端使用 HTTP 429 进行响应。

我发送的 lambda(通过 HTTPS 的 JSON 正文)仅在服务以 HTTP 200 响应时从队列中删除消息,否则我对 receiptHandle 什么都不做,我认为应该将消息保留在队列中。

无论如何,当请求被服务拒绝时,消息不再可用,因此它永远不会再次尝试发送并且永远丢失。

传入 SQS 已设置如下:

  • 可见性超时:3 分钟
  • 交货延迟:0s
  • 接收消息等待时间:1s
  • 消息保留期:1d
  • 最大消息大小:256Kb

关联 DLQ 的最大接收数为 100

消费 lambda 配置为

  • 内存:128Mb
  • 超时:10 秒
  • 触发器:源 SQS 队列,批处理大小:10,批处理窗口:无

我在 lambda 中的实际逻辑非常简单,真的。它接收的事件是队列中的Records。 Lambda 一次可能会获取多条记录,但所有记录都是单独处理的。

console.log('Response', response);

if (response.status === 'CREATED') {

  /* some code here */

  const deleteParams = {
    QueueUrl: queueUrl, /* required */
    ReceiptHandle: receiptHandle /* required */
  };

  console.log('Removing record from ', queueUrl, 'with params', deleteParams);    
  await sqs.deleteMessage(deleteParams).promise();
} else {
  /* any record that ends up here, are never seen again :( */
  console.log('Keeping record in', eventSourceARN);
}

做什么 :( ?!?!11

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda amazon-sqs


    【解决方案1】:

    否则我对receiptHandle什么都不做,我认为应该将消息保留在队列中

    那是not now it works:

    Lambda 轮询队列并与包含队列消息的事件同步调用您的 Lambda 函数。 Lambda 分批读取消息并为每个批次调用一次您的函数。 当您的函数成功处理批处理时,Lambda 会从队列中删除其消息。

    【讨论】:

    • 请详细说明
    • @MikkoViitala 我不确定您要详细说明。 @Parsifal 和文档告诉您的是,当 SQS 队列触发带有来自队列的 n 消息的 lambda 时,消息进入其可见性超时,如果 lambda 成功退出,则消息将从队列中删除。如果 lambda 失败,消息要么再次可见,或者,如果您有 DLQ,则发送到那里。
    • 是的,文档。我浏览了它们,遇到了 TL;DR 的情况,错过了我需要一个实际返回值而不是尝试手动处理删除的要点。
    【解决方案2】:

    当从 Amazon SQS 队列触发 AWS Lambda 函数时,与 SQS 相关的所有活动都由 Lambda 服务处理。 您的代码不应调用任何 Amazon SQS 函数。

    消息将通过 event 参数提供给 AWS Lambda 函数。当函数成功退出后,Lambda 服务将从队列中删除消息。

    您的代码不应调用DeleteMessage()

    如果您希望指示部分消息未成功处理,您可以使用partial batch response 来指示哪些消息已成功处理。然后,AWS Lambda 服务将使不成功的消息再次在队列中可用。

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 2015-04-27
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      相关资源
      最近更新 更多