RabbitMq生产者消息确认
RabbitMq 生产者消息确认
生产者权衡
快、低==========> 慢、高
- 无保障
- 失败通知 参数mandatory 消息是否成功到达队列
- 发送方确认模式 消息是否成功到达exchange 和失败通知结合使用
- 备用交换机 定义个一个备用交换机 Map
- 高可用队列
- 事务 影响性能 2-10倍 强一致性
- 事务+高可用
- 持久化
失败通知 需要开启 PublisherReturns=true mandatory=true
1 | // 初始化一个rabbitTemplateReturn 用来做失败通知 设置PublisherReturns=true |
发送方确认模式 需要开启 PublisherReturns=true mandatory=true
确认的三种方式:
channel.waitForConfirms()普通发送方确认模式;消息到达交换器,就会返回true
channel.waitForConfirmsOrDie()批量确认模式;使用同步方式等所有的消息发送之后才会执行后面代码,只要有一个消息未到达交换器就会抛出IOException异常
channel.addConfirmListener()异步监听发送方确认模式
1 |
|
以上确认可互相配合
- 发送消息前,绑定并保存msgId和message的关系
- 当confirm或return回调时,根据ack类别等,分别处理. 例如return或者ack=false则说明有问题,报警, 如果ack=true则删除关系(因为return在confirm前,所以一条消息在return后又ack=true的情况也是按return处理)
- 定时检查这个绑定关系列表,如果发现一些已经超时(自己设定的超时时间)未被处理(即未return和confirm),则手动处理这些消息.
- 需要注意如果是自动重发的话,消费端需要做幂等或去重处理.
备用交换机
- 定义一个备用交换机
- 声明一个map key为”alternate-exchange” value为备用交换机的名称
- 声明主交换机时添加参数map
- 如果发送消息到主交换机失败则会转发到备用交换机
1 |
|
高可用队列
集群情况使用
消息持久化
可靠性最高
事务 事务高可用队列
不使用 性能损耗严重