0Pricing
AWS Solutions Architect · 课时

可见性超时、DLQ 与长轮询

设置可见性超时以避免消息被重复处理,将失败消息路由到死信队列,并通过长轮询降低成本。

可见性超时、DLQ 与长轮询 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。

可见性超时机制

当消费者从 SQS 接收消息时,该消息会在一段称为可见性超时的时间内对所有其他消费者隐藏。在此期间,消费者处理消息,然后将其删除。如果消费者崩溃或未能及时完成处理,可见性超时到期,消息会重新变为可见,其他消费者便可以获取它。这是 SQS 实现至少一次投递保证的核心机制。

配置可见性超时

默认可见性超时为30 秒,可设置为 0 秒至12 小时。请将其设置为明显超过预期最长处理时间的值——如果处理最多需要 2 分钟,请将超时设置为至少 3 至 4 分钟。您还可以使用 change-message-visibility 针对单个回执更改超时时间;当消费者发现处理某条特定消息需要更多时间时,这非常有用。

# Extend visibility timeout for a specific message
aws sqs change-message-visibility \
  --queue-url 'https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue' \
  --receipt-handle 'AQEBwJnKyrHigUMZj...' \
  --visibility-timeout 300

超时过短与过长

将超时设置得过短会导致消息在消费者完成处理前重新出现,从而引发重复处理。将超时设置得过长时,如果原消费者无提示地失败(例如 EC2 实例崩溃且未进行正常清理),会延迟其他消费者获取消息。最佳超时时间应略长于处理时间的第 99 百分位,同时足够短,以便从消费者故障中快速恢复。请监控 ApproximateNumberOfMessagesNotVisible CloudWatch 指标,以发现超时问题。

什么是死信队列

死信队列(DLQ)是一个独立的 SQS 队列,消息在处理失败达到可配置次数(即 maxReceiveCount)后会被发送到这里。当消息的接收次数超过 maxReceiveCount 时,SQS 会自动将其移动到 DLQ。DLQ 可以防止有毒消息(始终处理失败的消息)无限期阻塞队列。修复处理错误后,您可以检查、调试并重新处理 DLQ 中的消息。

配置死信队列

DLQ 就是一个普通的 SQS 队列(Standard 源队列对应 Standard,FIFO 源队列对应 FIFO)。您需要在源队列上配置重驱动策略(Redrive Policy),以指定哪个队列是 DLQ,以及 maxReceiveCount 阈值。请确保 DLQ 的保留期更长,超过源队列的保留期——消息到达 DLQ 时已经较晚,您需要留出调查时间,避免消息过期。

aws sqs set-queue-attributes \
  --queue-url 'https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue' \
  --attributes '{
    "RedrivePolicy": "{\"deadLetterTargetArn\": \"arn:aws:sqs:us-east-1:123456789012:MyDLQ\", \"maxReceiveCount\": \"5\"}"
  }'

DLQ 监控和告警设置

请针对 DLQ 的 ApproximateNumberOfMessagesVisible 指标设置 CloudWatch 告警。任何进入 DLQ 的消息都表示存在需要处理的失败。请将告警配置为触发 SNS 通知,立即通知值班工程师。请将每条 DLQ 消息都视为需要调查的错误——不应让 DLQ 消息在无人察觉的情况下不断累积。修复错误后,请使用 DLQ 重驱动将消息发送回源队列重新处理。

DLQ 重驱动:重新处理消息

修复导致处理失败的错误后,请使用 SQS DLQ 重驱动将消息从 DLQ 移回源队列重新处理。控制台提供内置的重驱动功能。您可以按消息属性进行筛选,只重新处理特定消息。如果需要自定义筛选逻辑,也可以编写 Lambda 函数轮询 DLQ,并将消息转发回源队列。

# Start DLQ message move task
aws sqs start-message-move-task \
  --source-arn 'arn:aws:sqs:us-east-1:123456789012:MyDLQ' \
  --destination-arn 'arn:aws:sqs:us-east-1:123456789012:MyQueue' \
  --max-number-of-messages-per-second 5

短轮询与长轮询

默认情况下,SQS 使用短轮询:receive-message 调用会随机抽取部分服务器并立即返回,即使当前没有可用消息。这会产生大量空响应并浪费 API 调用。长轮询会等待消息到达,最长20 秒后才返回空响应。长轮询可以显著降低成本(减少 API 调用次数)并降低延迟(消息到达后会立即被接收,比下一轮轮询最多提前 20 秒)。

启用长轮询

您可以在队列级别启用长轮询(应用于所有接收调用),也可以按请求启用。对于大多数应用,建议在队列级别将 ReceiveMessageWaitTimeSeconds 配置为 20。当 Lambda 使用 SQS 作为事件源时,会自动使用长轮询。对于基于 EC2 的消费者,请在 receive-message 调用中设置 WaitTimeSeconds。

# Enable long polling at queue level (recommended)
aws sqs set-queue-attributes \
  --queue-url 'https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue' \
  --attributes '{"ReceiveMessageWaitTimeSeconds": "20"}'

# Or per-request
aws sqs receive-message \
  --queue-url 'https://...' \
  --wait-time-seconds 20 \
  --max-number-of-messages 10

消息属性和筛选

SQS 消息可以携带消息属性——与消息正文分离的元数据键值对。属性具有类型(字符串、数字、二进制)和值。当 SQS 订阅 SNS 主题时,您可以使用应用于消息属性的SNS 订阅筛选策略,仅将相关消息路由到各个队列。如果不进行筛选,每个 SQS 订阅者都会收到 SNS 发布的每条消息,无论内容是什么。

延迟队列和消息计时器

延迟队列会让每条新消息在发送后的一段延迟时间内保持不可见,延迟时间为 0 至 15 分钟。这适用于消费者不应立即处理消息的工作流,例如先等待某个依赖流程完成。您还可以在发送调用中使用 DelaySeconds 设置单条消息的延迟,该设置会覆盖队列级别的延迟。注意:FIFO 队列不支持延迟队列。

# Create a delay queue (5 minute delay)
aws sqs create-queue \
  --queue-name 'DelayedProcessingQueue' \
  --attributes '{"DelaySeconds": "300"}'

快速检查

测试您对本课 AWS Solutions Architect (SAA-C03) 概念的理解。

课程回顾

在本课中,您学习了:可见性超时会在消息处理期间将消息对其他使用者隐藏,从而实现至少一次投递;如果使用者失败,系统会自动重新投递。死信队列会捕获反复失败的消息,以便在修复错误后进行调试和重新处理;长轮询(最长等待 20 秒)相比短轮询可以降低 API 成本和延迟。接下来,我们将探索 SNS 主题和扇出架构。

常见问题解答

「可见性超时、DLQ 与长轮询」课时是免费的吗?

是的 — 「可见性超时、DLQ 与长轮询」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。

「可见性超时、DLQ 与长轮询」这节课中我会学到什么?

设置可见性超时以避免消息被重复处理,将失败消息路由到死信队列,并通过长轮询降低成本。 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AWS Solutions Architect 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「可见性超时、DLQ 与长轮询」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AWS Solutions Architect 课中编写并运行代码吗?

能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. SQS Standard 与 FIFO 队列
  2. 可见性超时、DLQ 与长轮询
  3. SNS 主题与扇出架构
  4. SQS 消息筛选与 SNS + SQS 集成
← 返回 AWS Solutions Architect