Kafka重复消费

目录
1.出现的情况
2.解决方案

出现的情况

1.crash来不及提交Offset

  • 读完消息先commit(提交Offset),再处理消息 => commit后,还没来得及处理就crash
    • 实际是没有处理,但是Offset已经提交, 丢失消费
  • 读完消息,处理消息后,再commit(提交Offset) => 处理完消息后,还没commit就crash
    • 实际处理完,但是Offset还没有提交, 重复消费

2.在session时间内未提交Offset

kafka的consumer消费数据时首先会从broker里读取一批消息数据进行处理,处理完成后再提交offset。而我们项目中的consumer消费能力比较低,导致取出的一批数据在session.timeout.ms时间内没有处理完成,自动提交offset失败,然后kafka会重新分配partition给消费者,消费者又重新消费之前的一批数据,又出现了消费超时,所以会造成死循环,一直消费相同的数据。  

解决方案

针对上述情况1.

1.放弃效率换取可靠性
读完消息,处理消息后,再commit(提交Offset),本地收到消息,持久化消息到数据库(记录ID,10001),提交Offset后,才清空数据库改记录.冗机后,重启启动,如果数据库没有改记录则可以消费下一条,有的话,则从记录开始的ID开始消费
效率太低,但是确保.每读完一条消息调用一下consumer.commitOffsets()

2.或者不理会重复消费情况,客户端的处理逻辑
每条消息有其特定的标识,在处理消息前,查询数据库是否存在该记录,存在则放弃,反之出处理(消息可以使用唯一id标识)

针对上述情况2.
http://blog.csdn.net/u011637069/article/details/72899915

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka重复消费指的是消费者可能会在某些情况下重复消费相同的消息。Kafka 是一个分布式消息系统,它的消费者组可以有多个消费者同时消费同一个主题的消息。当某个消费消费一条消息时,Kafka 就会将该消息的 offset 值保存在消费者组的 offset 管理器中。这样,其他消费者就可以从该 offset 值开始消费后续的消息。 Kafka重复消费可能发生在以下几种情况下: 1. 消费者手动重置 offset:如果消费者手动将 offset 重置到之前已经消费过的位置,那么接下来消费者就会重新消费之前已经消费过的消息。 2. 消费者组 rebalance:当消费者组发生 rebalance 时,消费者会重新分配分区。如果一个消费者之前消费了某个分区的消息,但在 rebalance 后该分区被分配给了另一个消费者,那么该消费者就会重新消费该分区之前已经消费过的消息。 3. 消息重复发送:在某些情况下,生产者可能会重复发送相同的消息。如果消费者在消费该消息时出现了异常,那么该消息就可能被重复消费。 为了避免 Kafka重复消费,可以考虑使用以下几种策略: 1. 自动管理 offset:Kafka 提供了自动管理 offset 的功能,消费者可以将 offset 保存在 Kafka 中,这样就可以避免手动重置 offset 的问题。 2. 避免 rebalance:可以通过调整消费者组的配置来避免 rebalance 的频繁发生。 3. 消费幂等性:消费者可以实现消费幂等性,即使消息重复消费也不会对系统产生影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值