Amazon Simple Queue Service
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

使用 Amazon SQS 死信队列

Amazon SQS 支持 死信队列。死信队列是其他 (源) 队列可将其作为无法成功处理 (使用) 的消息的目标的队列。您可以在死信队列中留出和隔离这些消息以确定其处理失败的原因。

死信队列的工作方式

有时会因各种可能的问题 (例如,创建器应用程序或使用器应用程序内的错误条件) 而导致无法处理消息。例如,如果用户在创建账户的特定时间 (分钟) 内下订单,则创建器可能会将消息与空字符串 (而不是客户标识符) 一起传递。

有时,创建器和使用器可能无法解释其用于通信的协议的各个方面,从而导致消息中断或丢失。此外,使用器的硬件错误可能会中断消息负载。

重新驱动策略 指定源队列死信队列 以及 Amazon SQS 将消息从前者移至后者的条件 (如果源队列的使用器无法处理消息指定次数)。例如,如果源队列的重新驱动策略已将 maxReceiveCount 设置为 5,并且源队列的使用器收到一条消息 5 次而从未处理或删除它,则 Amazon SQS 会将该消息移至死信队列。

要指定死信队列,您可以使用 AWS 管理控制台或 API 操作。您必须为将消息发送到死信队列的每个队列执行此操作。多个队列可将一个死信队列作为目标。有关更多信息,请参阅Configuring an Amazon SQS Dead-Letter Queue以及 CreateQueueSetQueueAttributes API 操作的 RedrivePolicy 属性。

重要

FIFO 队列的死信队列也必须为 FIFO 队列。同样,标准 队列的死信队列也必须为 标准 队列。

您必须使用相同的 AWS 账户来创建死信队列以及向死信队列发送消息的其他队列。此外,死信队列必须驻留在使用死信队列的其他队列所在的区域中。例如,如果在美国东部(俄亥俄州) 区域中创建一个队列,并且要对该队列使用死信队列,则第二个队列也必须位于美国东部(俄亥俄州) 区域中。

死信队列有哪些好处?

死信队列的主要任务是处理消息失败。利用死信队列,您可以留出和隔离无法正确处理的消息以确定其处理失败的原因。设置死信队列可让您执行以下操作:

  • 为传输到死信队列的任何消息配置警报。

  • 查看日志以了解可能导致消息传输到死信队列的异常。

  • 分析传输到死信队列的消息的内容,以诊断软件问题或创建器/使用器的硬件问题。

  • 确定您是否为使用器提供了充足的时间来处理消息。

不同的队列类型如何处理消息失败?

标准队列

标准队列会在保留期结束前继续处理消息。这可确保连续处理消息,从而最大程度地减小队列由无法处理的消息阻止的几率。它还可以确保快速恢复您的队列。

在一个处理数千条消息的系统中,拥有使用器反复无法确认和删除的大量消息可能会增加成本并给硬件带来额外负载。最好是在几次处理尝试之后将失败的消息移至死信队列,而不是在这些消息到期前一直尝试处理它们。

注意

标准队列允许大量正在传输的消息。如果您的大多数消息无法使用且无法发送到死信队列,则处理有效消息的速率将下降。因此,要保持队列的效率,您必须确保应用程序正确处理消息。

FIFO 列队

FIFO 队列通过按顺序使用消息组中的消息,确保只进行一次处理。因此,尽管使用器可继续检索另一个消息组中的有序消息,在阻止队列的消息得到成功处理之前,第一个消息组将保持不可用状态。

注意

FIFO 队列允许少量正在传输的消息。因此,要确保您的 FIFO 队列不会被消息阻止,您必须确保应用程序正确处理消息。

何时应使用死信队列?

请不要将死信队列用于标准队列。当您的应用程序不依赖排序时,您应始终利用死信队列。死信队列可帮助您排查不正确的消息传输操作的问题。

注意

即使您使用死信队列,也应继续监控您的队列并重试发送因临时原因而失败的消息。

请不要使用死信队列来减少消息数和降低将系统公开给毒丸消息 (可接收但无法处理的消息) 的几率。

当您希望能够无限地重试传输消息时,请不要对标准队列使用死信队列。例如,如果您的程序必须等待某个依赖过程变得有效或可用,请不要使用死信队列。

如果您不想中断消息或操作的准确顺序,请不要对 FIFO 队列使用死信队列。例如,请不要对视频编辑套件的编辑决策列表 (EDL) 中的指令使用死信队列,此情况下,更改编辑的顺序将更改后续编辑的上下文。

死信队列入门

有关如何使用 AWS 管理控制台或查询 API 操作创建死信队列的信息,请参阅Configuring an Amazon SQS Dead-Letter Queue教程。

您可以使用以下 API 操作配置一个 Amazon SQS 队列用作死信队列。

任务 API 操作
为新队列配置死信队列。 CreateQueue
为现有队列配置死信队列。 SetQueueAttributes
确定队列是否使用死信队列。 GetQueueAttributes

排查死信队列的问题

在某些情况下,Amazon SQS 死信队列的行为可能并不总是符合预期。此部分概述了常见问题并说明如何解决这些问题。

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

在 AWS 管理控制台中根据相应队列的重新驱动策略查看消息时,Amazon SQS 将进行计数。因此,如果您在 AWS 管理控制台中将消息查看相应队列的重新驱动策略中指定的次数,则该消息将移至相应队列的死信队列中。

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

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

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

死信队列的 NumberOfMessagesSentNumberOfMessagesReceived 不匹配

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