Amazon Simple Queue Service
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

使用 Amazon SQS 死信队列

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

注意

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

要指定死信队列,您可以使用 AWS 管理控制台或查询 API。必须为将向死信队列发送消息的每个队列执行此操作。多个队列可将一个死信队列作为目标。

重要

您必须使用相同的 AWS 账户创建死信队列和将向该死信队列发送消息的其他队列。此外,死信队列还必须与使用死信队列的其他队列位于相同的区域中。例如,如果在美国东部(俄亥俄州)区域中创建一个队列,并且要对该队列使用死信队列,则两个队列必须都位于美国东部(俄亥俄州)区域中。

使用 AWS 管理控制台设置死信队列

您可以使用 AWS 管理控制台将无法成功处理的消息发送给指定的死信队列。

  1. 对于现有的和新建的源队列,选择 Use Redrive Policy

  2. 键入源队列要将消息发送到的队列的名称。

  3. Maximum Receives 设置为介于 1 和 1000 之间的值。

    注意

    Maximum Receives 设置 (消息在发送给死信队列可接收的次数) 仅适用于单个消息。

下图显示的 MyQueueRedrive Policy 已配置为将消息发送到 MyDeadLetterQueue

通过 Amazon SQS API 使用死信队列

要使用查询 API 指定死信队列,请调用 CreateQueueSetQueueAttributes 操作并为 RedrivePolicy 队列属性设置 maxReceiveCountdeadLetterTargetArn 参数。

您可以将 maxReceiveCount 设置为介于 1 到 1000 之间的值。deadLetterTargetArn 值是将接收死信消息的队列的 Amazon 资源名称 (ARN)。

以下 Java 示例演示如何使用 SetQueueAttributesRedrivePolicy 队列属性设置 maxReceiveCountdeadLetterTargetArn 参数。此示例基于 AWS SDK for Java 中的 SimpleQueueServiceSample.java 示例。

首先,设置一个字符串,其中包含 JSON 格式的参数和 RedrivePolicy 队列属性的值:

Copy
String redrivePolicy = "{\"maxReceiveCount\":\"5\", \"deadLetterTargetArn\":\"arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue\"}";

接下来,使用 SetQueueAttributesRequest 设置 RedrivePolicy 队列属性:

Copy
SetQueueAttributesRequest queueAttributes = new SetQueueAttributesRequest(); Map<String,String> attributes = new HashMap<String,String>(); attributes.put("RedrivePolicy", redrivePolicy); queueAttributes.setAttributes(attributes); queueAttributes.setQueueUrl(myQueueUrl); sqs.setQueueAttributes(queueAttributes);

此示例的 API 查询请求应类似于以下内容:

Copy
http://sqs.us-east-2.amazonaws.com/123456789012/MySourceQueue ?Action=SetQueueAttributes &Attribute.1.Value=%7B%22maxReceiveCount%22%3A%225%22%2C+%22deadLetterTargetArn%22%3A%22arn%3Aaws%3Asqs%3Aus-east-2%3A123456789012%3AMyDeadLetterQueue%22%7D &Version=2012-11-05 &Attribute.1.Name=RedrivePolicy

注意

队列名称和队列 URL 区分大小写。

API 查询响应应类似于以下内容:

Copy
<SetQueueAttributesResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/"> <ResponseMetadata> <RequestId>40945605-b328-53b5-aed4-1cc24a7240e8</RequestId> </ResponseMetadata> </SetQueueAttributesResponse>

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

Amazon SQS 将对按照相应队列的重新驱动策略在 Amazon SQS 控制台中查看消息计数。因此,如果您在 Amazon SQS 控制台中将消息查看相应队列的重新驱动策略中指定的次数,则该消息将移至相应队列的死信队列中。

要调整此行为,您可以增加相应队列的重新驱动策略的 Maximum Receives 设置,或避免在 Amazon SQS 控制台中查看相应队列的消息。

重现此行为:

  1. 在 Amazon SQS 控制台中创建队列,队列的名称分别为 MyQueueAMyQueueB

  2. 从队列列表中,选择 MyQueueA。然后依次选择 Queue ActionsConfigure Queue

    随即显示 Configure MyQueueA 对话框。

  3. 对于 Dead Letter Queue Settings,选择 Use Redrive Policy

    对于 Dead Letter Queue,键入 MyQueueB。(MyQueueB 将成为 MyQueueA 的死信队列。)

    对于 Maximum Receives,键入 2,然后选择 Save Changes。(在查看消息两次后,消息将发送到死信队列 MyQueueB。)

  4. 在队列列表中仍选中 MyQueueA 的情况下,依次选择 Queue ActionsSend a Message

    随即显示 Send a Message to MyQueueA 对话框。

  5. Message Body 选项卡上,键入任意消息文本,然后选择 Send Message

    选择 Send Another Message,然后将另一条消息发送到 MyQueueA。然后选择 Close

  6. 在队列列表中仍选中 MyQueueA 的情况下,依次选择 Queue ActionsView/Delete Messages

    随即显示 Start Polling for Messages 对话框。

  7. 选择 Start Polling for Messages。随即显示您发送的消息。

  8. 等待 1 分钟,然后再次选择 Start Polling for Messages。将重新显示您发送的消息。(两条消息的 Receive Count 已变为 2。这与您指定的 Maximum Receives 值相等。)

  9. 等待 1 分钟,然后再次选择 Start Polling for Messages。此时,您发送的消息将不再显示。(您已查看消息两次。这与您指定的 Maximum Receives 值相等。) 选择 Close

  10. 在队列列表中,清除 MyQueueA。然后,依次选择 MyQueueBQueue ActionsView/Delete Messages

    选择 Start Polling for Messages。随即显示您发送的消息。(MyQueueB 已变为 MyQueueA 的死信队列。)

问题:死信队列的 NumberOfMessagesSent 和 NumberOfMessagesReceived 不匹配

如果您手动向死信队列发送消息,它将由 NumberOfMessagesSent 指标捕获。

但是,如果某条消息由于处理尝试失败而发送到死信队列,它将不会由 NumberOfMessagesSent 指标捕获。在这种情况下,NumberOfMessagesSentNumberOfMessagesReceived 指标的值可能是不同的。