代码之家  ›  专栏  ›  技术社区  ›  Artur Skrzydło

在AWS中定义SQS的回退策略

  •  0
  • Artur Skrzydło  · 技术社区  · 6 年前

    我想在Spring应用程序中为sqs设置一个退避策略。我所做的是:

        @Bean
        public ConnectionFactory sqsConnectionFactory() {
    
            PredefinedBackoffStrategies.ExponentialBackoffStrategy backoffStrategy = new PredefinedBackoffStrategies.ExponentialBackoffStrategy(3, 27);
            RetryPolicy retryPolicy = new RetryPolicy(PredefinedRetryPolicies.DEFAULT_RETRY_CONDITION, backoffStrategy, PredefinedRetryPolicies.DEFAULT_MAX_ERROR_RETRY, false);
            return SQSConnectionFactory.builder()
                    .withRegion(Region.getRegion(Regions.fromName(region)))
                    .withAWSCredentialsProvider(new DefaultAWSCredentialsProviderChain())
                    .withClientConfiguration(new ClientConfiguration().withRetryPolicy(retryPolicy))
                    .build();
        }
    

    ,但没有效果。我从simple的SQS队列中阅读 @JmsListener 方法在这个方法中,有对其他api的调用。这个api返回404错误。然后是重试,但这是即时重试。为什么,如何正确地配置指数退避策略?它在重试,但不是指数延迟时间。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Pranjal    6 年前

    退避策略设定在 ClientConfiguration 在您的代码中,用于为AWS客户端连接到AWS服务的重试提供延迟。这意味着,如果(比如出于某种原因)AWS SQS客户端无法连接到AWS SQS服务以获取消息(或轮询新消息),将使用您设置的策略。如果发生此类故障,则应在配置设备提供的延迟后进行下一次尝试 ExponentialBackoffStrategy 。有关更多详细信息,请参阅 official documentation here .

    立即重试的原因

    对于您的情况,底层客户机(Spring的 @JmsListener ).如果这一步失败,将使用 指数备份策略 。之后的故障(如404之后引发的异常)将触发对SQS服务的故障确认,该服务将立即使消息再次可见以供使用。

    如何将退避策略与重新交付关联

    遗憾的是,这种策略不能与消息消耗失败相关联。 所需的延迟实际上是JMS 2.0规范的延迟 延迟交货 .但您似乎正在使用的SQS JMS提供程序就是这个 https://github.com/awslabs/amazon-sqs-java-messaging-lib 这就是JMS 1.1的实现。以下是从他们的文件中引用的相同内容:

    该项目构建在AWS SDK for Java之上,以使用Amazon SQS 作为JMS(定义见1.1规范)提供者

    此外,SQS没有类似的功能 redelivery-delay 在他们的重新驾驶政策中(只有 Maximum Receives Dead Letter Queue 协会)。因此,一个可能的解决方法是自行处理故障,并设置特定于消息的延迟(更多) here )在每次重新排队时递增(这可能包括在报头中处理重试计数,而不使用JMS)。请注意,这可能会产生额外费用。

    另一方面: 在读取消息时,向队列中添加延迟或可见性超时将无助于减少故障之间的延迟。