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); } }