当前位置: 首页 > article >正文

Spring AMQP-lazy队列

普通队列和惰性队列的区别

特性普通队列惰性队列
消息存储位置消息首先存储在内存中,当内存不足时才会溢写到磁盘消息直接存储在磁盘上,只有当消费者准备消费时才加载到内存
内存使用使用较多内存,适合消息量较少、需要快速处理的场景使用较少内存,适合消息量大、需要长时间存储的场景
消息处理速度消息处理速度较快,因为消息主要在内存中进行操作消息处理速度相对较慢,因为需要从磁盘读取消息
适用场景适用于消息量较少、需要快速处理的场景适用于消息量大、需要长时间存储的场景,如消息堆积问题
系统稳定性在消息量过大时,可能会导致内存溢出,影响系统稳定性由于减少了内存使用,提高了系统的稳定性
I/O使用I/O使用相对较少I/O使用相对较多,因为需要频繁地从磁盘读取和写入消息
消息可靠性消息可靠性依赖于持久化设置,如果未设置持久化,在宕机时可能会丢失消息消息可靠性较高,因为消息直接存储在磁盘上,即使在宕机时也不会丢失
性能影响在消息量适中时,性能较好在消息量极大时,性能较好,但在消息量较小时,可能会因为磁盘I/O而影响性能

推荐使用什么?

一般情况都是根据场景来决定的以下是他们适合的场景。

普通队列:将消息直接存入内存,读取数据快,但是消息容易溢出,安全性较低,适用于实时的消息传递高频交易、订单等(读取数据块,处理速度快)

惰性队列:消息存入磁盘,安全性较高、适用于消息量大,且容易堆积的场景,比如日志、事件追踪、大规模数据等

创建惰性队列


1. 控制台创建

在创建队列的时候点击以下 Lazy mode即可创建为惰性队列

2. 声明式创建

package com.itheima.consumer.config;

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

import java.util.HashMap;
import java.util.Map;

@Configuration
public class RabbitConfig {

    @Bean
    public Queue lazyQueue() {
        // 创建一个Map来存储队列的参数
        Map<String, Object> args = new HashMap<>();
        // 设置队列为惰性队列
        args.put("x-queue-mode", "lazy");
        // 返回一个Queue对象,设置队列为持久化
        return new Queue("fanout.hamll.lazy.query1", true, false, false, args);
    }
}

3. 注解创建

package com.itheima.consumer.listener;

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;

@Component
public class MyRabbitListener {

    @RabbitListener(bindings = @QueueBinding(
            // 定义队列
            value = @Queue(
                    name = "fanout.hamll.lazy.query1", // 队列名称
                    durable = "true", // 是否持久化
                    // 设置队列为惰性队列
                    arguments = @Argument(name = "x-queue-mode", value = "lazy") // 惰性队列
            ),
            // 定义交换机
            exchange = @Exchange(
                    name = "fanout.hamll", // 交换机名称
                    type = ExchangeTypes.FANOUT // 交换机类型为Fanout
            )
    ))
    public void query2(String message) {
        // 打印接收到的消息
        System.err.println("fanout.hamll.lazy.query1: " + message);
    }
}


http://www.kler.cn/a/487409.html

相关文章:

  • VS2015 + OpenCV + OnnxRuntime-Cpp + YOLOv8 部署
  • 【python基础——异常BUG】
  • 怎样修改el-table主题样式
  • OSPF - 2、3类LSA(Network-LSA、NetWork-Sunmmary-LSA)
  • 蓝桥杯训练
  • 数据结构:包装类和泛型
  • spring boot controller放到那一层
  • mysql连表查询报Illegal mix of collations (utf8mb4_general_ci,IMPLICIT)
  • stringRedisTemplate.execute执行lua脚本
  • TypeScript语言的数据结构
  • Mongodb基础sqL
  • 21天掌握javaweb-->第20天:项目总结与文档编写
  • MySQL —— 在CentOS9下安装MySQL
  • 海信116英寸RGB-Mini LED:一朵绽放在科技穹顶的中国花火
  • 【简博士统计学习方法】第1章:3. 统计学习方法的三要素
  • 借助免费GIS工具箱轻松实现las点云格式到3dtiles格式的转换
  • C#中Linq的使用
  • 【学习笔记】数据结构(十二)
  • STM32-RTC实时时钟
  • uniapp:钉钉小程序需要录音权限及调用录音
  • 工作中Excel技巧整理
  • Android GSI (Generic System Image)
  • 2025年01月09日Github流行趋势
  • 在Rust中实现Drop trait的注意事项有哪些?
  • IP属地与IP地址:联系与区别的深度剖析
  • 【网络协议】IPv4 地址分配 - 第二部分