带有DLQ的SQS - 消息处理

时间:2017-12-01 18:53:24

标签: amazon-sqs

我对SQS Source Queue及其DLQ如何处理消息处理存有疑问。

我知道SQS没有像JMS那样实现trasaction,而是使用带超时的锁,因此在超时到期后,其他订阅者可以从队列中获取。

说过如何实现下面的行为(使用更多的SQS配置而不是客户端实现)?

  • 订阅者在SQS中侦听消息;
  • 尝试处理邮件;
  • 如果失败,则重试3次,例如;
  • 如果我的重试尝试失败,我必须将消息发送到DLQ并从源队列中删除它。

1 个答案:

答案 0 :(得分:1)

这基本上是为您构建的SQS。通常,您的配置是将死信队列作为主队列的重新驱动目标。指定3作为"最大接收"对于重新启动政策。然后,您的主要代码将类似于:

while( true ) {
    ReceiveMessageRequest receiveMessageRequest =
          new ReceiveMessageRequest(eventQueueUrl)
                        .withMaxNumberOfMessages(10)
                        .withWaitTimeSeconds(5);

    List<Message> messages = amazonSQS.receiveMessage(receiveMessageRequest)
                                                              .getMessages();

   for (Message nextMessage: messages) {
       // handle the message.  if the handling fails just continue.

       // if the message was processed correctly, delete it
       amazonSQS.deleteMessage(queueURL,nextMessage.getReceiptHandle() );
   }
}

这里的关键是,如果你不从主队列中删除该消息,它将在默认情况下再次可用,30秒。这可以作为主要队列&#34;默认可见性超时&#34;的一部分进行更改。如果你删除它,它将永远不会再被看到。在您的失败情况下,您将处理该消息3次,并且在失败多次之后,它将自动移动到死信队列。

关于死信队列的轻微警告 - 在您尝试读取第四时间之前,该消息不会移动到死信队列。你的代码永远不会看到它,但如果你尝试3次并期望它在第三次阅读后最终进入DLQ,你就不会看到它。当您第4次尝试阅读时,AWS意识到它无法将其提供给您并为您移动。

除此之外 - 我认为Java是你提到JMS的。

相关问题