1.rabbitmq 默认轮训机制消费消息
2.消息确认:消费者一端通过basicConsum开启手动ack,并发送消息tag,如果开始了手动确认,又未发送确认消息将重新回队,等待再次被消费
3.队列持久化通过生产者一端durable参数设定,消息持久化通过发送时设置
4.通过以上两步持久化设置还不够,万无一失还要开启消息发布确认机制,发送时通过channel.confirmSelect();开启,发送后通过channel.waitForConfirms();确认
发布确认原理详见 RabbitMQ 的发布确认_喵先森爱吃鱼的博客-优快云博客_rabbitmq发布确认
5.异步消息确认通过addConfirmListener异步监听实现,可以异步监听已确认和未确认的消息,
exchange
direct直连,通过routingkey把exchange和queue绑定,生产者通过routingkey指定发送的queue
fanout广播模式,exchange和queue不需要routingkey绑定,生产者将发送到所有queue
topic模式,通过routingkey把exchange和queue绑定,生产者可指定routingkey将消息发送到对应queue,*为一个单词#为一个或多个单词,例:绑定asd.rabbit.zz 可通过*.rabbit.*发送到对应queue;rabbit.lkdj.adf 可通过rabbit.#发送到对应queue
死信队列
进入死信队列三种情况,ttl消息超时,消息被拒,队列长度超出,可设置普通队列产生异常时指定的死信队列,可以定义queue时设置ttl消息超时与队列长度,消费者手动应答处设置消息拒绝
prority
消费优先级 队列设置arguments.put("x-max-priority", 10); 消息也要对应的设置优先级builder.priority(nextInt); 必须两个都设置,只有在消费者不繁忙时,有时间让消息在Chanel中按优先级排队才能达到消费者按优先级消费的目的,在消息积压的时候进行按照优先级排序,它需要排序
延迟队列
通过声明队列时设置x-message-ttl 失效时间,与生产者设置消息失效时间
getMessageProperties().setExpiration(ttlTime);
或
设置交换机"x-delayed-type","direct" x-delayed-message
但延迟队列有一个问题,当信道中存在失效时间长的消息,后边失效时间短的消息也会排队等待前序消息发出,所以必须排序先发失效时间短的消息再发失效时间长的。
问题-基于插件
参考docker中安装RabbitMQ(DelayExchange)插件_Max恒的博客-优快云博客_docker rabbitmq 插件
注意mq与插件版本对应,可在官网查询
格式为: docker cp 本机文件路径 容器名称(必须是容易长ID):路径
其中的xxx就是你自己的本机路径(可以容器里查询 ls -la)
docker cp /xxxx/rabbitmq_delayed_message_exchange-3.10.0.ez 2ffdfb45dd4d7b7b3b2ee9e7ba1dd8f6a374dee5fb144e7c895639ce42ce0a6a:/opt/rabbitmq/plugins/rabbitmq_delayed_message_exchange-3.10.0.ez
springboot发布确认(基于exchange)
spring: rabbitmq: publisher-confirm-type: correlated #开启回调并通过回调接口RabbitTemplate.ConfirmCallback处理 publisher-confirm: true
spring:
rabbitmq:
publisher-return: ture 开启消费回退通过接口RabbitTemplate.ReturnCallback退回消息
备份交换机 设置alternate-exchange 指定备用交换机,如果无法以其他方式路由到此交换的消息将发送到备用交接机
惰性队列x-queue-mode lazy 存储在磁盘上节省空间
集群镜像模式
通过设置policy策略ha-mode ha-params ha-sync-mode三个参数将某个节点的数据备份到其他节点上保证单节点down机消息不丢失
rabbitmq官方文档说集群节点,连接顺序无所谓,node1先连Node2还是node3,无所谓都会建立联系。
镜像模式如果所有节点都备份数据是占用磁盘 i/o的,建议n/2-1节点