MQ死信队列:面试题

所谓的死信队列只不过是我们自己定义的一个队列,注意对于这个队列只能人工干预

面试题:你们是如何保证消息不会丢失的

1,什么是死信

在RabitMQ中充当主角的就是消息,在不同场景下,消息会有不同地表现。

死信就是在特定的场景下的一种表现形式,这些场景包括:

1. 消息被拒绝访问,即 RabbitMQ返回 basicNack 的信号时 或者拒绝basicReject

2. 消费者发生异常,超过重试次数 。 其实spring框架调用的就是 basicNack

3. 消息的Expiration 过期时长或队列TTL过期时间

4. 消息队列达到最大容量

上述场景经常产生死信,即消息在这些场景中时,被称为死信。

2,什么是死信队列

死信队列就是存储死信的消息队列,在死信队列中,有且只有死信构成,不存在其他类型的消息

死信队列在 RabbitMQ 中并不会单独存在,往往死信队列都会绑定这一个普通的业务消息队列,当所绑定的消息队列中,有消息变成死信了,那么这个消息就会重新被交换机路由到指定的死信队列中去,我们可以通过对这个死信队列进行监听,从而手动的去对这一消息进行补偿。 人工干预

3、那么,我们到底如何来使用死信队列呢?

死信队列基本使用,只需要在声明业务队列的时候,绑定指定的死信交换机和RoutingKey即可。


public class DeadConsumer {
    //死信交换机
    @Bean
    public DirectExchange deadExchange(){
        return  ExchangeBuilder.directExchange("Dead_E01").build();
    }
    //死信队列
    @Bean
    public Queue deadQueue1(){
        return   QueueBuilder.durable("Dead_Q01").build();
    }
    //死信交换机与死信队列的绑定
    @Bean
    public Binding deadBinding1(Queue deadQueue1,DirectExchange deadExchange){
        return BindingBuilder.bind(deadQueue1).to(deadExchange).with("RK_DEAD");
    }
    //业务队列
    @Bean
    public Queue queue1(){
      return   QueueBuilder
              .durable("Direct_Q01")
              .deadLetterExchange("Dead_E01")
              .deadLetterRoutingKey("RK_DEAD")
              //.ttl(10*1000) //该属性是队列的属性,设置消息的过期时间,消息在队列里面停留时间n毫秒后,就会把这个消息投递到死信交换机,针对的是所有的消息
              //.maxLength(20) //设置队列存放消息的最大个数,x-max-length属性值,当队列里面消息超过20,会把队列之前的消息依次放进死信队列
              .build();
    }

    //业务交换机
    @Bean
    public DirectExchange exchange(){
        return  ExchangeBuilder.directExchange("Direct_E01").build();
    }
    //业务交换机与队列的绑定
    @Bean
    public Binding binding1(Queue queue1,DirectExchange exchange){
        return BindingBuilder.bind(queue1).to(exchange).with("RK01");
    }

    //@RabbitListener(queues = "Direct_Q01")
    public void receiveMessage(OrderingOk msg) {
        log.info("消费者1 收到消息:"+ msg );
        int  i= 5/0;
    }

//    @RabbitListener(queues = "Direct_Q01")
//    public void receiveMessage(OrderingOk msg,Message message, Channel channel) throws IOException {
//
//        long deliveryTag = message.getMessageProperties().getDeliveryTag();
//
//        System.out.println("消费者1 收到消息:"+ msg +" tag:"+deliveryTag);
//
//        channel.basicReject(deliveryTag, false);
//        try {
//            // 处理消息...
//            int  i= 5/0;
//            // 如果处理成功,手动发送ack确认 ,Yes
//            channel.basicAck(deliveryTag, false);
//        } catch (Exception e) {
//            // 处理失败,可以选择重试或拒绝消息(basicNack或basicReject)  NO
//            channel.basicNack(deliveryTag, false, false); // 并重新入队
//
//        }
    }


//}




4. 自动应答死信配置

#-------------MQ 高级配置---------

#预抓取数量

spring.rabbitmq.listener.simple.prefetch=50

#设置消费者手动应答模式

spring.rabbitmq.listener.simple.acknowledge-mode = auto

#开启自动应答重试机制

spring.rabbitmq.listener.simple.retry.enabled=true

#默认重试3次

spring.rabbitmq.listener.simple.retry.max-attempts=3

#重试间隔时间 单位ms

spring.rabbitmq.listener.simple.retry.initial-interval=1000ms

#时间间隔倍数,默认是1倍

spring.rabbitmq.listener.simple.retry.multiplier=2

#最大间隔时间

spring.rabbitmq.listener.simple.retry.max-interval=5000ms





相关推荐

  1. 面试总结-MQ总结

    2024-04-10 17:30:03       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-10 17:30:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-10 17:30:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-10 17:30:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-10 17:30:03       20 阅读

热门阅读

  1. Python map遍历

    2024-04-10 17:30:03       16 阅读
  2. BERT入门:理解自然语言处理中的基本概念

    2024-04-10 17:30:03       14 阅读
  3. About MATLAB

    2024-04-10 17:30:03       14 阅读
  4. 【鸿蒙NEXT】设置全屏

    2024-04-10 17:30:03       38 阅读
  5. Vue中实现【组件局部刷新】及【页面刷新】

    2024-04-10 17:30:03       15 阅读
  6. Linux中redis测试环境搭建3主3从

    2024-04-10 17:30:03       13 阅读
  7. linux microcom输出十六进制的方式

    2024-04-10 17:30:03       14 阅读
  8. LeetCode 94. 二叉树的中序遍历

    2024-04-10 17:30:03       12 阅读
  9. 【Linux】tcpdump P2 - 捕获和查看网络数据包

    2024-04-10 17:30:03       15 阅读
  10. Git 命令及示例

    2024-04-10 17:30:03       14 阅读
  11. 等价类测试

    2024-04-10 17:30:03       12 阅读
  12. 坚持10天做完Python入门编程100题第二天

    2024-04-10 17:30:03       14 阅读
  13. 树的总结学习

    2024-04-10 17:30:03       14 阅读
  14. Linux find命令详解与实际使用

    2024-04-10 17:30:03       13 阅读