rabbitmq避免消息丢失和重复消费

1.生产者发送消息给mq时丢失
事务机制和confirm机制,事务机制是同步的,很消耗性能,常用的是confirm机制
事务机制:channel.txSelect   可开启事务,如果报错会回滚  channel.txRollback    如果没问题就提交   channel.txCommit
confirm机制:开启后,每个消息都会分配唯一的 id,mq如果收到会回传一个 ack消息,如果没有收到会回调你的一个 nack 接口,超过时间没接收到回调消息,生产者重发消息。

confirm机制是异步的,不接收回调也能继续发送下个消息,rabbitmq的回调也是异步的

2.在mq里发生丢失
首先在创建mq时开启持久化,然后发送消息的时候将消息的 deliveryMode 设置为 2,意思就是持久化,两步一起


3.发送消息给消费者时丢失

发送消息给消费者成功了,但如果就在此时,消费者的逻辑还没跑完,然后宕机了,那么这个消息就丢失了
关闭MQ的自动ack机制,通过一个 api 来调用就行,消费者的代码逻辑处理完,再在程序里 ack 。如果mq没有收到ack,证明这个消息没有被处理,可以继续发送给消费者



重复消费
 

  • 在消息生产时,MQ内部针对每条生产者发送的消息生成一个inner-msg-id,作为去重和幂等的依据(消息投递失败并重传),避免重复的消息进入队列;
  • 在消息消费时,要求消息体中必须要有一个bizId(对于同一业务全局唯一,如支付ID、订单ID、帖子ID等)作为去重和幂等的依据,避免同一条消息被重复消费
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值