消息丢失类型 | 发送丢失 1、未到达交换机 2、未到达队列 | 存储丢失 | 消费丢失 |
原因 | 发送过程中网络异常 | 未开启持久化,MQ宕机却未消费消息 | 接收成功,但未消费成功 |
解决方案 | 1、未到达交换机 ①、开启同步等待,直到超时(阻塞影响性能) ②、异步回调,回调ConfirmCallback 2、未到达队列 异步回调,回调ReturnCallback | 开启持久化: 交换机持久化、 队列持久化、 消息持久化(默认开启) HA集群? 消息补偿机制? | 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 #有无状态 |
消息重复|重复消费
出现场景 | 消息确认-自动 | 消息确认-手动 |
原因 | 自动提交后网络异常,Mq未确认成功,导致消息重发,继而导致重复消费 | 1、消费者手动提交前宕机,确认失败,消息保留, 导致消息重复,继而导致重复消费 2、手动提交后网络异常,MQ未确认成功,因异常会保留消息,导致消息重复消费。 |
解决思路 | 1、消息需要唯一id,第三方组件保存消息,消费时查询判断是否已经消费。 2、消息需要唯一id,消费者保存消息时,自行判断 | 同左 |
仍待修改完善。。。