【RabbitMQ】如何保证消息消费时的幂等性+如何处理消息丢失的问题

本文探讨了如何在RabbitMQ中确保消息消费的幂等性,通过数据库唯一性索引、基于ID的检查等方法避免重复消费。同时,针对消息丢失问题,文章分析了可能出现的三种情况,并提出使用事务、确认机制、持久化等策略来保证消息的可靠传输。消费者应关闭AutoACK,手动确认消息处理完成,以防止数据丢失。
摘要由CSDN通过智能技术生成

一、如何保证消息消费时的幂等性

      这个问题可以等价于如何保证消费不被重复消费?为什么在消费队列里消费到了重复的数据。

1、kafak消费端可能导致的重复消费问题

                     

       消费者准备提交offset,但还没有提交的时候,消费者进程被重启了(比如说宕机了,或者kill-9啦)。那么此时已经消费过的数据offset还没有提交。kafka也就不知道你消费了offset=153的那条数据。

       消费者一旦重启,马上会找kafka说:哥们,把我上次消费到的那条数据之后的数据给我。数据1和数据2又发送过来了。等于对你来说,数据1和数据2在数据库里消费了2次。 

2、如何保证重复消费的幂等性

     这个还得结合业务来思考,这里给几个思路。

     ① 如果你拿个数据要写库,你先根据主键id查一下。如这数据都有了,你就别插入了。update一下。

     ② 如果你拿个数据是要更新表里的字段,直接update就好,幂等的。

     ③ 基于数据库的唯一性索引。因为有唯一性索引了。所以重复数据只会插入报错,不会导致数据库中出现重复的数据。

     ④ 如果你是写redis,那没问题了。每次都是set,天然幂等。

     ⑥ 如果不是上面的场景,那想的稍微复杂一点,需要生产者在发送消费的时候里面加一个全局性的唯一ID(UUID或者雪花算法),类似于订

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值