消息丢失类型 | 发送丢失 1、未到达交换机 2、未到达队列 | 存储丢失 | 消费丢失 |
原因 | 发送过程中网络异常 | 未开启持久化,MQ宕机却未消费消息 | 接收成功,但未消费成功 |
解决方案 | 1、未到达交换机 ①、开启同步等待,直到超时(阻塞影响性能) ②、异步回调,回调ConfirmCallback 2、未到达队列 异步回调,回调ReturnCallback | 开启持久化: 交换机持久化、 队列持久化、 消息持久化(默认开启) | ack消息确认机制 ①、手动模式,需要在业务中手动发送ack,异常会保留消息 ②、自动模式,无异常自动确认, 有异常可开启消费失败重试 ③、关闭,消息接收后删除消息 |
配置 | 1、未到达交换机,yaml文件配置 publisher-confirm-type: correlated 参数:simple #同步等待 correated #异步回调 2、未到达队列 publisher-returns: true 参数:true #调用ReturnCallBack false #直接丢弃消息 | mq控制面板:交换机和队列属性durability设置为durable 代码: | 消息确认机制,ymal文件: listener: simple: acknowledge-mode: manual 参数:manual #手动 auto #自动 none #关闭 自动模式,开启消息失败重试机制,ymal acknwledge-mode: auto retry: enabled: true #开启重试 initial-intervale: 1000 #第一次和第二次尝试传递消息之间的持续时间 multipiter: 1 #重试间隔 max-attempts: 3 #最大尝试次数 max-intervale: 10000, #尝试最长持续时间 stateless: true #有无状态 |
仍待修改完善。。。