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