本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
对 Amazon SQS 死信队列和 DLQ 重新驱动问题进行故障排除
以下主题涵盖了 Amazon SQS DLQ 和 DLQ 重新驱动问题的最常见原因以及如何对其进行故障排除。有关更多信息,请参阅如何解决 Amazon SQS DLQ
DLQ 问题
了解常见的 DLQ 问题以及如何解决这些问题。
主题
使用控制台查看消息可能会导致消息移至死信队列
在控制台中根据相应队列的重新驱动策略查看消息时,Amazon SQS 将进行计数。因此,如果您在控制台中查看相应队列的重新驱动策略中指定的次数的消息,则该消息将被移至相应队列的死信队列。
要调整此行为,您可以执行下列操作之一:
-
针对相应队列的重新驱动策略增大 Maximum Receives 设置。
-
避免在控制台中查看相应队列的消息。
死信队列的 NumberOfMessagesSent
和 NumberOfMessagesReceived
不匹配
如果您手动向死信队列发送消息,它将由 NumberOfMessagesSent 指标捕获。不过,如果因处理尝试失败而发送消息到死信队列,则此指标不会捕获该消息。因此,NumberOfMessagesSent
和的值可能会NumberOfMessagesReceived有所不同。
创建和配置死信队列重新驱动器
死信队列重新驱动需要您为 Amazon SQS 设置相应的权限,以接收来自死信队列的消息,并将消息发送到目标队列。如果您没有正确的权限,则死信队列重新驱动任务可能会失败。您可以查看邮件重新驱动任务的状态以修复问题,然后重试。
标准和 FIFO 队列消息故障处理
标准队列会一直处理消息,直到保留期到期。这种持续处理可最大限度地减少队列被未消耗的消息阻塞的机会。消费者反复删除大量消息会增加成本,并给硬件带来额外的负担。为了降低成本,请将失败的消息移至死信队列。
标准队列还允许发送大量动态消息。如果您的大部分消息无法使用,也没有发送到死信队列,则您的消息处理速度可能会减慢。要保持队列的效率,请确保您的应用程序正确处理消息。
FIFO 队列通过按顺序使用消息组中的消息,确保仅处理一次。因此,尽管使用者可以继续从另一个消息组检索已排序的消息,但在成功处理阻塞队列的消息或将其移至死信队列之前,第一个消息组仍不可用。
此外,FIFO 队列允许减少传输中消息的数量。要防止 FIFO 队列被消息阻止,请确保您的应用程序正确处理消息。
有关更多信息,请参阅 亚马逊 SQS 消息配额 和 亚马逊 SQS 最佳实践。
DLQ-redrive 问题
了解常见的 DLQ-reDrive 问题以及如何解决这些问题。
AccessDenied 权限问题
当 DLQ 重新驱动因为 AWS Identity and Access Management (IAM) 实体没有所需权限而失败时,就会发生AccessDenied
错误。
错误消息示例:
Failed to create redrive task. Error code: AccessDenied - Queue Permissions to Redrive.
发出 DLQ 重新驱动请求需要以下 API 权限:
要开始重新驱动消息,请执行以下操作:
-
死信队列权限:
-
sqs:StartMessageMoveTask
-
sqs:ReceiveMessage
-
sqs:DeleteMessage
-
sqs:GetQueueAttributes
-
kms:Decrypt
— 当死信队列或原始源队列被加密时。
-
-
目标队列权限:
-
sqs:SendMessage
-
kms:GenerateDataKey
— 当目标队列被加密时。 -
kms:Decrypt
— 当目标队列被加密时。
-
要取消正在进行的留言重新存档,请执行以下操作:
-
死信队列权限:
-
sqs:CancelMessageMoveTask
-
sqs:ReceiveMessage
-
sqs:DeleteMessage
-
sqs:GetQueueAttributes
-
kms:Decrypt
— 当死信队列或原始源队列被加密时。
-
要显示邮件移动状态,请执行以下操作:
-
死信队列权限:
-
sqs:ListMessageMoveTasks
-
sqs:GetQueueAttributes
-
NonExistentQueue 错误
当 Amazon SQS 源队列不存在或已被删除时,就会发生NonExistentQueue
错误。检查并重新驱动到存在的 Amazon SQS 队列。
错误消息示例:
Failed: AWS.SimpleQueueService.NonExistentQueue
CouldNotDetermineMessageSource 错误
当您尝试在以下情况下启动 DLQ 重新驱动时会发生CouldNotDetermineMessageSource
错误:
-
通过 API 直接发送到 DLQ 的 Amazon SQS 消息。
SendMessage
-
来自配置了 DLQ 的亚马逊简单通知服务 (Amazon SNS) Simple Notification 主题 AWS Lambda 或函数的消息。
要解决此错误,请在开始重新驱动时选择 “重新驱动到自定义目的地”。然后,输入 Amazon SQS 队列 ARN,将所有消息从 DLQ 移至目标队列。
错误消息示例:
Failed: CouldNotDetermineMessageSource