参数配置
算是我学习的大纲了,理解每一个配置的含义,挖掘更多的问题
参考: https://blog.csdn.net/qq_36259143/article/details/120284682
路由类型及消息的生产、消费方式
direct模式(默认) 指定的路由、队列
fanout广播模式所有与指定路由绑定的队列
topic主题模式:指定路由 通过* #模糊筛选
#标识任意单词 *只能匹配一个单词
a.*可以匹配 a.b
a.#可以匹配a.b.c
headers模式 通过绑定路由时,设置的参数进行匹配,匹配方式:
x-match=any 满足一个条件 (默认类型)
x-match=all 全部满足
重试机制配置
消费异常重试 开启 次数 最大间隔时间 初始间隔时间 倍数(间隔时间=上一次间隔时间*倍数 第二次起)
spring.rabbitmq.listener.simple.retry.enabled=true 开启
spring.rabbitmq.listener.simple.retry.max-attempts=3 最大次数3 既重试2次
spring.rabbitmq.listener.simple.retry.max-interval=10000 间隔最大10秒
spring.rabbitmq.listener.simple.retry.initial-interval=2000 首次间隔2秒
spring.rabbitmq.listener.simple.retry.multiplier=2 间隔倍数2既 第二次 2*2=4秒 第三次 4*2=8秒
重试次数用完任失败处理:配置失败路由、用于记录失败信息或者其他操作
@bean
public MessageRecoverer messageRecoverer(RabbitTemplate rabbitTemplate){
return new RepublishMessageRecoverer(rabbitTemplate,"","error_queue"); 重新发送给指定路由、队列
}
发布确认及退回回调函数开启
发布消息时,需要传入唯一cd用于识别
CorrelationData correlationData = new CorrelationData(Utils.getUUID());
发布确认 实现ConfirmCallback接口 confirm方法
spring.rabbitmq.publisher-confirm-type springboot2.22以上版本
NONE 值是禁用发布确认模式(默认)
CORRELATED 值是发布消息成功到交换器后会触发回调方法
SIMPLE
spring.rabbitmq.publisher-confirms=true springboot2.22以下版本
退回回调函数开启 不能找到队列的消息 调用指定函数 实现ReturnCallback接口 returnedMessage方法
spring.rabbitmq.publisher-returns=true
参考 https://blog.csdn.net/laifengtao/article/details/129295152
备份交换机(广播模式)
无路由消息进入备份交换机 优先级高于回调函数
用于保住消息到队列时的安全,不丢失
增加交换机参数 alternate-exchange=backup.exchange
ack模式
手动确认消息消费
cknowledge-mode:manual手动确认 none自动确认 根据情况确认不确认
设置死信交换机 路由(不能单独指定路由) 确认不通过时进入
手动确认方法 参考:https://blog.csdn.net/qq2942713658/article/details/124067585
并发
#并发 每一个listener最小 最大并发处理数量
spring.rabbitmq.listener.simple.concurrency=1
spring.rabbitmq.listener.simple.max-concurrency=3
一个消费监听一次最大读取到的数量 将消息从队列(ready)取到缓存中(unacked) 避免高峰期全量进入造成宕机
spring.rabbitmq.listener.simple.prefetch=5 2个消费者监听一个消费队列时 一共读取10条
顺序消费
x-single-active-consumer=true 队列单一消费者
一个queue对应一个消费者 即监听数1 concurrency=1 保住顺序消费 单点宕机会造成消息堆积(使用死信队列、死信交换机解决)
有限个数的消息顺序 使用多个queue 一个queue对应一个消费者 用全区map存储初始消费第一个消息的消费者、消费后续 2 3。。时判断,不对的抛弃
避免重复消费
1对1 即一个消息对应一个队列时 不会重复 direct模式
1对多 topic、headers、fanout 一个消息对应多个队列时,使用第三方例如redis等数据库存储id判断
queue参数
/**
* durable:是否持久化,默认是false,持久化队列(内部会有一个actualName: 队列的真实名称,默认用name参数,如果name为空,则根据规则生成一个)
* exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
* autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
* arguments:设置队列的属性参数
* 1、x-message-ttl:消息的过期时间,单位:毫秒;
* 2、x-expires:队列过期时间,队列在多长时间未被访问将被删除,单位:毫秒;
* 3、x-max-length:队列最大长度,超过该最大值,则将从队列头部开始删除消息;
* 4、x-max-length-bytes:队列消息内容占用最大空间,受限于内存大小,超过该阈值则从队列头部开始删除消息;
* 5、x-overflow:设置队列溢出行为。这决定了当达到队列的最大长度时消息会发生什么。有效值是drop-head、reject-publish或reject-publish-dlx。仲裁队列类型仅支持drop-head;
queue溢出行为,这将决定当队列达到设置的最大长度或者最大的存储空间时发送到消息队列的消息的处理方式;
* 有效的值是:
* drop-head(删除queue头部的消息)、
* reject-publish(最近发来的消息将被丢弃)、
* reject-publish-dlx(拒绝发送消息到死信交换器)
* 类型为quorum 的queue只支持drop-head;
* 6、x-dead-letter-exchange:死信交换器名称,过期或被删除(因队列长度超长或因空间超出阈值)的消息可指定发送到该交换器中;
* 7、x-dead-letter-routing-key:死信消息路由键,在消息发送到死信交换器时会使用该路由键,如果不设置,则使用消息的原来的路由键值
* 8、x-single-active-consumer:表示队列是否是单一活动消费者,true时,注册的【消费组】内只有一个消费者消费消息,其他被忽略,false时消息循环分发给所有消费者(默认false)
* 9、x-max-priority:队列要支持的最大优先级数;如果未设置,队列将不支持消息优先级;
* 10、x-queue-mode(Lazy mode):将队列设置为延迟模式,在磁盘上保留尽可能多的消息,以减少RAM的使用;如果未设置,队列将保留内存缓存以尽可能快地传递消息;
* 11、x-queue-master-locator:在集群模式下设置镜像队列的主节点信息。
不能单独指定死信消息路由键,需要在指定死信交换器的前提下才能使用
rabbit集群(尚未研究)
参考:
https://blog.csdn.net/u010502101/article/details/127081418
https://blog.csdn.net/weixin_46106066/article/details/105497184
消费组(尚未研究)
参考:https://blog.csdn.net/tian830937/article/details/127857192
相关问题
1.消息堆积问题
提高消费速度:1.增加消费者 2.消费者内部使用多线程加快处理
提高容量:使用惰性队列 将数据存储在磁盘中,效率受限于磁盘的IO效率 队列参数x-queue-mode=lazy
参考:https://blog.csdn.net/weixin_53041251/article/details/123459600
2.保证数据不丢失
通过发布确认、退回回调函数、消费ack手动确认、死信队列、备份交换机、失败重试、失败函数