一、如何保证消息消费时的幂等性
这个问题可以等价于如何保证消费不被重复消费?为什么在消费队列里消费到了重复的数据。
1、kafak消费端可能导致的重复消费问题

消费者准备提交offset,但还没有提交的时候,消费者进程被重启了(比如说宕机了,或者kill-9啦)。那么此时已经消费过的数据offset还没有提交。kafka也就不知道你消费了offset=153的那条数据。
消费者一旦重启,马上会找kafka说:哥们,把我上次消费到的那条数据之后的数据给我。数据1和数据2又发送过来了。等于对你来说,数据1和数据2在数据库里消费了2次。
2、如何保证重复消费的幂等性
这个还得结合业务来思考,这里给几个思路。
① 如果你拿个数据要写库,你先根据主键id查一下。如这数据都有了,你就别插入了。update一下。
② 如果你拿个数据是要更新表里的字段,直接update就好,幂等的。
③ 基于数据库的唯一性索引。因为有唯一性索引了。所以重复数据只会插入报错,不会导致数据库中出现重复的数据。
④ 如果你是写redis,那没问题了。每次都是set,天然幂等。
⑥ 如果不是上面的场景,那想的稍微复杂一点,需要生产者在发送消费的时候里面加一个全局性的唯一ID(UUID或者雪花算法),类似于订

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

被折叠的 条评论
为什么被折叠?



