【问题标题】:Delayed requeuing through Rabbit DLQ通过 Rabbit DLQ 延迟重新排队
【发布时间】:2018-01-30 22:49:37
【问题描述】:

我正在尝试按照here 描述的模式设置延迟重新排队失败消息的队列。

我尝试尽可能地从文档中复制配置示例,但创建的死信队列本身并未绑定回 DLX。我不清楚为什么不。

虽然我看到了另一个潜在的解决方案,但我没有依赖默认行为,而是尝试显式设置 dlqDeadLetterExchange 和 dlqDeadLetterRoutingKey 属性,看看我是否可以做到这一点。我的配置如下所示:

rabbit:
  bindings:
    input:
      consumer:
        autoBindDlq: true
        bindingRoutingKey: my-routing-key
        dlq-ttl: 5000
        deadLetterExchange: dead-letter-exchange
        deadLetterQueueName: my-queue-dl
        dlqDeadLetterExchange: dead-letter-exchange
        dlqDeadLetterRoutingKey: my-queue-dl

这几乎可以工作。完成该模式所需要做的就是手动将绑定添加到 DLX,该 DLX 将使用“my-queue-dl”路由键的消息路由回“my-queue”。但是,我还没有找到使用记录的 spring-cloud-streams 配置属性的方法。有没有标准的方法来做到这一点?某种“dlqDeadLetterExchangeBinding”配置?

【问题讨论】:

    标签: spring-cloud-stream spring-rabbit


    【解决方案1】:

    Retry With the RabbitMQ Binder

    autoBindDlq 设置为true - 活页夹将创建一个DLQ;您可以选择在 deadLetterQueueName 中指定一个名称

    dlqTtl 设置为您希望在重新投递之间等待的延迟时间

    dlqDeadLetterExchange 设置为默认交换 - 来自 DLQ 的过期消息将被路由到原始队列,因为默认的 deadLetterRoutingKey 是队列名称(destination.group)

    关键短语是“将 dlqDeadLetterExchange 设置为默认交换器” - 该技术依赖于这样一个事实,即每个队列都绑定到默认交换器,其路由键等于队列名称。

    我刚刚又测试了一遍,效果很好……

    @SpringBootApplication
    @EnableBinding(Sink.class)
    public class So48531769Application {
    
        public static void main(String[] args) {
            SpringApplication.run(So48531769Application.class, args);
        }
    
        @StreamListener(Sink.INPUT)
        public void listen(String in, @Header(name = "x-death", required = false) List<?> death) {
            System.out.println(in + ":" + death);
            throw new RuntimeException("failed");
        }
    
    }
    

    spring:
      cloud:
        stream:
          bindings:
            input:
              consumer:
                max-attempts: '1'
              group: foo
          rabbit:
            bindings:
              input:
                consumer:
                  autoBindDlq: 'true'
                  dlq-dead-letter-exchange:
                  dlq-ttl: '5000'
    

    请注意,dlq-dead-letter-exchange 属性未指定值 - 这意味着将过期消息路由到默认交换。

    input.foo

    input.foo.dlq

    【讨论】:

    • 如何实现本文jack-vanlightly.com/blog/2017/3/24/…中提到的延迟重试消息模式。我不想从死信队列中丢失消息,也不想通过退避重试。一旦重试次数用尽,我希望消息在 DLQ 中排队。
    猜你喜欢
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多