MQ消息重复消费

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校验是否已经存在;数据库可以设计一张专门用来校验数据的表,把唯一标识存入数据库,或者在当前操作的数据库表上多加一个唯一字段,用于存储唯一字段,每次都通过数据库校验是否重复消费;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容