1.消息重复消费
- 场景:
- 以Kafka举例,生产者发送三条消息到Kafka,分别为:数据一(offset:1)、数据二(offset:2)、数据三(offset:3).消费者从mq中消费数据,offset1的数据消费成功,数据保存到数据库,消费者提交offset,通过zookeeper记录当前offset1已经被消费,消费者继续消费数据二,消费成功,数据保存到数据库,消费者准备提交offset2,此时消费者挂了,offset2没有能提交,那么这个offset2没有没被zookeeper记录已经消费,当程序重启时,消费者继续向mq消费数据,此时Kafka从zookeeper获取到上次最后消费的是offset1,那么mq会把offset1后面的数据发送给消费者,此时消费者消费到offset2数据,这就造成数据重复消费.
- 常用方案:
- 1.通过唯一标识,列如:Kafka的offset、MQ的Message ID、数据中有保证唯一字段,
- 2.可以每次消费数据把唯一标识存入redis,每次操作数据可以去redis校验是否已经存在;数据库可以设计一张专门用来校验数据的表,把唯一标识存入数据库,或者在当前操作的数据库表上多加一个唯一字段,用于存储唯一字段,每次都通过数据库校验是否重复消费;