美文网首页微服务实践
消息队列之kafka的重复消费

消息队列之kafka的重复消费

作者: 语落心生 | 来源:发表于2019-07-11 16:41 被阅读0次

Kafka 是对分区进行读写的,对于每一个分区的消费,都有一个 offset 代表消息的写入分区时的位置,consumer 消费了数据之后,每隔一段时间,会把自己消费过的消息的 offset 提交一下。表示已记录当当前的消费位置,从这里开始消费。

mq-3.png

这么个场景。数据 1/2/3 依次进入 kafka,kafka 会给这三条数据每条分配一个 offset,代表这条数据的序号,我们就假设分配的 offset 依次是 152/153/154。消费者从 kafka 去消费的时候,也是按照这个顺序去消费。假如当消费者消费了 offset=153 的这条数据,刚准备去提交 offset 到 zookeeper,此时消费者进程被重启了。那么此时消费过的数据 1/2 的 offset 并没有提交。于是1/2这两条消息又被重复消费了

如何保证幂等性

假设有个系统,消费一条消息就往数据库里插入一条数据,要是一个消息重复两次,数据就被重复消费了。当消费到第二次的时候,要判断一下是否已经消费过了,这样就保留了一条数据,从而保证了数据的正确性。

一条数据重复出现两次,数据库里就只有一条数据,这就保证了系统的幂等性。

幂等性,即一个请求,给你重复来多次,确保对应的数据是不会改变的,不能出错。

这里有以下几种方案

  • 先写数据库,根据主键查一下,如果这数据存在,就update
  • 先写redis,用set结构去重
  • 在进MQ之前,需要让生产者发送每条数据的时候,里面加一个全局唯一的 id,类似订单 id 之类的东西,当开始消费的时候,先根据这个 id 去比如 Redis 里查一下,如果没有消费过,这个 id 写 Redis。如果消费过了,那不处理了,保证别重复处理相同的消息即可。
  • 设置唯一索引去重

相关文章

  • 消息队列

    为什么使用消息队列?消息队列有什么优点和缺点? 如何保证消息队列高可用?如何保证消息不被重复消费? kafka,a...

  • 消息队列之kafka的重复消费

    Kafka 是对分区进行读写的,对于每一个分区的消费,都有一个 offset 代表消息的写入分区时的位置,cons...

  • Kafka_核心

    kafka集群 Kafka的设计都是为了实现kafak消息队列消费数据的语义Kafka消息队列中数据消费的三种语义...

  • MQ随记(2)

    如何保证消息不会被重复消费(保证消息消费时的幂等性) kafka 按照数据进入kafka的顺序,kafka会给每条...

  • 消费者竞争模式 Competing Consumers Patt

    在并发情况下, 允许多个消费者消费同一个消息队列, 并保证消息被消费的基本语义(Kafka的模式). 通过消费者之...

  • 消息队列之Kafka

    # 消息队列之Kafka 作者:徐方友 审稿人:徐江河&李亮 ## 消息队列 ### 为什么使用消息队列? * *...

  • 项目笔记5-KafKa

    目前最好的异步消息队列处理器 阻塞队列 写一个生产者消费者模式,使用阻塞队列 Kafka入门 消息持久化:消息永久...

  • Kafka中消息丢失和重复消费,以及Leader选举机制

    一、Kafka中的消息是否会丢失和重复消费 要确定Kafka的消息是否丢失或重复,从两个方面分析入手:消息发送和消...

  • kafka防止消息重复消费

    kafka重复消费的根本原因就是“数据消费了,但是offset没更新”!而我们要探究一般什么情况下会导致offse...

  • 02_Kafka重要概念及相关操作

    Kafka提供的主要功能 生产者 ——>消息队列 <——消费者 所谓消息对象,本质上就是由生产者向消息队列不断发送...

网友评论

    本文标题:消息队列之kafka的重复消费

    本文链接:https://www.haomeiwen.com/subject/eihdkctx.html