RabbitMQ学习七 RabbitMQ的可靠性
默认情况下,RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟。这样做可能对导致两个问题:
- 
一旦MQ宕机,内存中的消息会丢失 
- 
要解决上述两个问题,RabbitMQ给出了两个解决方案:数据持久化和Lazy Queue。
数据持久化是3.6之前提出的,3.6之后RabbitMQ又提出了Lazy Queue。
一、数据持久化
数据持久化可以包括三个方面:
交换机持久化:在创建交换机时,可以把交换机设置成Durable
队列持久化: 在创建队列时,可以把队列设置成Durable
消息持久化: 在发送消息时,DeliveryMode 选择2

开启生产者确认时,此时每秒只能接收600
@RequestMapping("/sendMessageConfirmRate")
    public String sendMessageConfirmRate(){
        Message message = MessageBuilder
                .withBody("hello".getBytes(StandardCharsets.UTF_8))
                .setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT)
                .build();
        for(int i=0;i<1000000;i++){
            rabbitTemplate.convertAndSend("simple_queue",message);
        }
        return "ok";
    }
关闭生产者确认
从上图中也可以看到,当发送临时消息很快时,会造成Paged Out,当Paged Out发生时,会造成MQ无法接收消息。
把上述队列中的消息清空,测试持久化队列的测试。
@RequestMapping("/sendMessageConfirmRate")
    public String sendMessageConfirmRate(){
        Message message = MessageBuilder
                .withBody("hello".getBytes(StandardCharsets.UTF_8))
                .setDeliveryMode(MessageDeliveryMode.PERSISTENT)
                .build();
        for(int i=0;i<1000000;i++){
            rabbitTemplate.convertAndSend("simple_queue",message);
        }
        return "ok";
    }
二、Lazy Queue
从RabbitMQ的3.6.0版本开始就增加了Lazy Queue的概念,也就是惰性队列。
惰性队列的特征如下:
- 
接收到消息后直接存入磁盘而非内存(内存中只保留最近的消息,默认2048条) 
- 
只有在消费者需要消费消息时才会从磁盘中读取并加载到内存 
- 
支持数百万条的消息存储。 
/**
     * 声明一个简单的队列
     * @return
     */
    @Bean("lazyQueue")
    public Queue lazyQueue(){
        return QueueBuilder
                .durable("lazy.queue")
                .lazy()
                .build();
    }或者在监听时声明
  @RabbitListener(queuesToDeclare = @Queue(
            name = "lazy.queue",
            durable = "true",
            arguments = @Argument(name = "x-queue-mode",value = "lazy")
    ))
    public void listenLazyQueue(String msg){
        System.out.println("消费消息"+msg);
    }一百万消息实验
@RequestMapping("/sendMessageConfirmRate")
    public String sendMessageConfirmRate(){
        Message message = MessageBuilder
                .withBody("hello".getBytes(StandardCharsets.UTF_8))
                .setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT)
                .build();
        for(int i=0;i<1000000;i++){
            rabbitTemplate.convertAndSend("lazy.queue",message);
        }
        return "ok";
    }




 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号