对 Amazon SQS 死信队列和DLQ重新驱动问题进行故障排除 - Amazon Simple Queue Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

对 Amazon SQS 死信队列和DLQ重新驱动问题进行故障排除

以下主题涵盖了 Amazon SQS DLQ 和DLQ重新驱动问题的最常见原因以及如何对其进行故障排除。有关更多信息,请参阅如何解决 Amazon SQS DLQ 重新驱动问题? 在Amazon 知识中心指南中。

DLQ问题

了解常见DLQ问题以及如何解决这些问题。

使用控制台查看消息可能会导致消息移至死信队列

A SQS mazon 会根据相应队列的重新驱动策略在控制台中查看消息。因此,如果您在控制台中查看相应队列的重新驱动策略中指定的次数的消息,则该消息将被移至相应队列的死信队列。

要调整此行为,您可以执行下列操作之一:

  • 针对相应队列的重新驱动策略增大 Maximum Receives 设置。

  • 避免在控制台中查看相应队列的消息。

死信队列的 NumberOfMessagesSentNumberOfMessagesReceived 不匹配

如果您手动向死信队列发送消息,它将由 NumberOfMessagesSent 指标捕获。不过,如果因处理尝试失败而发送消息到死信队列,则此指标不会捕获该消息。因此,NumberOfMessagesSent和的值可能会NumberOfMessagesReceived有所不同。

创建和配置死信队列重新驱动器

死信队列重新驱动需要您设置适当的权限,让 Amazon 从死信队列接收消息,并将消息发送SQS到目标队列。如果您没有正确的权限,则死信队列重新驱动任务可能会失败。您可以查看邮件重新驱动任务的状态以修复问题,然后重试。

标准消息和FIFO队列消息故障处理

标准队列会一直处理消息,直到保留期到期。这种持续处理可最大限度地减少队列被未消耗的消息阻塞的机会。如果有大量消息但消费者反复无法删除,则会增加成本,并给硬件带来额外的负担。为了降低成本,请将失败的消息移至死信队列。

标准队列还允许发送大量动态消息。如果您的大部分消息无法使用,也没有发送到死信队列,则您的消息处理速度可能会减慢。要保持队列的效率,请确保您的应用程序正确处理消息。

FIFO队列通过按顺序使用来自消息组的消息来提供一次性处理。因此,尽管使用者可以继续从另一个消息组检索已排序的消息,但在成功处理阻塞该队列的消息或将其移至死信队列之前,第一个消息组仍不可用。

此外,FIFO队列允许减少传输中消息的数量。要防止FIFO队列被消息阻止,请确保您的应用程序正确处理消息。

有关更多信息,请参阅Amazon SQS 消息配额亚马逊 SQS 最佳实践

DLQ-重新驱动问题

了解常见的 DLQ-redrive 问题以及如何解决这些问题。

AccessDenied 权限问题

当DLQ重新驱动失败时,就会发生AccessDenied错误,因为 Amazon Identity and Access Management (IAM) 实体没有所需的权限。

错误消息示例:

Failed to create redrive task. Error code: AccessDenied - Queue Permissions to Redrive.

发出DLQ重新驾驶请求需要以下API权限:

要开始重新驱动消息,请执行以下操作:

  • 死信队列权限:

    • sqs:StartMessageMoveTask

    • sqs:ReceiveMessage

    • sqs:DeleteMessage

    • sqs:GetQueueAttributes

  • 目标队列权限:

    • sqs:SendMessage

  • KMS加密死信队列时的密钥:

    • kms:Decrypt

  • KMS目标队列加密时的密钥:

    • kms:GenerateDataKey

要取消正在进行的留言重新存档,请执行以下操作:

  • 死信队列权限:

    • sqs:CancelMessageMoveTask

    • sqs:ReceiveMessage

    • sqs:DeleteMessage

    • sqs:GetQueueAttributes

要显示邮件移动状态,请执行以下操作:

  • 死信队列权限:

    • sqs:ListMessageMoveTasks

    • sqs:GetQueueAttributes

NonExistentQueue 错误

当 Amazon SQS 源队列不存在或已被删除时,就会发生NonExistentQueue错误。检查并重新驱动到存在的 Amazon SQS 队列。

错误消息示例:

Failed: AWS.SimpleQueueService.NonExistentQueue

CouldNotDetermineMessageSource错误

当您尝试在以下情况下开始DLQ重新驱动时会发生CouldNotDetermineMessageSource错误:

  • 直接发送给 SQS with 的 Amazon 消息SendMessageAPI。DLQ

  • 来自亚马逊简单通知服务 (AmazonSNS) 主题或 Amazon Lambda 函数的消息,其中DLQ已配置。

要解决此错误,请在开始重新驱动时选择 “重新驱动到自定义目的地”。然后,进入 Amazon SQS 队列,将所有消息从移ARNDLQ至目标队列。

错误消息示例:

Failed: CouldNotDetermineMessageSource