微服务框架 SpringCloud微服务架构 服务异步通讯 52 惰性队列 52.2 惰性队列

本文详细介绍了如何在SpringCloud应用中使用RabbitMQ的惰性队列技术,通过设置队列为懒惰模式,提升消息存储上限并优化性能。实践步骤包括配置惰性队列、发送大量消息和观察队列行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微服务框架

【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】

服务异步通讯

52 惰性队列

52.2 惰性队列
52.2.1 惰性队列

从RabbitMQ的3.6.0版本开始,就增加了Lazy Queues的概念,也就是惰性队列

惰性队列的特征如下:

  • 接收到消息后直接存入磁盘而非内存【传统的消息默认就是在 内存】
  • 消费者要消费消息时才会从磁盘中读取并加载到内存
  • 支持数百万条的消息存储

而要设置一个队列为惰性队列,只需要在声明队列时,指定x-queue-mode属性为lazy即可。可以通过命令行将一个运行中的队列修改为惰性队列:

在这里插入图片描述

用SpringAMQP声明惰性队列分两种方式:

  • @Bean的方式:

在这里插入图片描述

  • 注解方式:

在这里插入图片描述

试试@Bean 的

在消费者中新来 一 个配置类

package cn.itcast.mq.config;

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * ClassName: LazyConfig
 * date: 2022/11/9 21:33
 *
 * @author DingJiaxiong
 */

@Configuration
public class LazyConfig {

    //惰性队列
    @Bean
    public Queue lazyQueue(){

        return QueueBuilder.durable("lazy.queue")
                .lazy()
                .build();
    }

    //普通队列
    @Bean
    public Queue normalQueue(){

        return QueueBuilder.durable("normal.queue")
                .build();
    }


}

OK,直接运行消费者服务

查看RabbitMQ 的 控制台

在这里插入图片描述

OK。两个队列都创建 完成 了

编写发送消息的测试方法

@Test
public void testLazyQueue() throws InterruptedException {

    for (int i = 0; i < 1000000; i++) {
        //1. 准备消息
        Message message = MessageBuilder.withBody("Hello,Lazy!!!!".getBytes(StandardCharsets.UTF_8))
                .setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT)
                .build();

        //2. 发送消息
        rabbitTemplate.convertAndSend("lazy.queue", message);
    }

}

@Test
public void testNormalQueue() throws InterruptedException {

    for (int i = 0; i < 1000000; i++) {
        //1. 准备消息
        Message message = MessageBuilder.withBody("Hello,Lazy!!!!".getBytes(StandardCharsets.UTF_8))
                .setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT)
                .build();

        //2. 发送消息
        rabbitTemplate.convertAndSend("normal.queue", message);
    }

}

直接两个测试方法

在这里插入图片描述

查看RabbitMQ 控制台

在这里插入图片描述

我这峰值也太低了

在这里插入图片描述

服务器不行

点进Lazy队列

在这里插入图片描述

可以看到,它压根儿就没进内存

再看看normal

在这里插入图片描述

都在内存里面

【快停了,着不住】

在这里插入图片描述

还好我这性能不行,发半天了 才4 万

52.2.2 总结

消息堆积问题的解决方案?

  • 队列上绑定多个消费者,提高消费速度
  • 给消费者开启线程池,提高消费速度
  • 使用惰性队列,可以再mq中保存更多消息

惰性队列的优点有哪些?

  • 基于磁盘存储,消息上限高
  • 没有间歇性的page-out,性能比较稳定

惰性队列的缺点有哪些?

  • 基于磁盘存储,消息时效性会降低
  • 性能受限于磁盘的IO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祝我天天开心,平安健康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值