相关文章推荐
含蓄的大象  ·  【公布获奖】【小米用户独家福利】江湖召集令 ...·  8 月前    · 
安静的斑马  ·  BT种子磁力搜索与下载网站分享 - 知乎·  1 年前    · 
聪明伶俐的大海  ·  byde5_抖抖音·  1 年前    · 
傻傻的铁链  ·  离婚后前夫成了我的忠犬动漫图片,离婚后前夫成 ...·  1 年前    · 
阳光的墨镜  ·  一文看懂PBC、OKR、KPI,绩效管理工具 ...·  1 年前    · 
Code  ›  Kafka常见的导致重复消费原因和解决方案开发者社区
https://cloud.tencent.com/developer/article/1665700
喝醉的哑铃
1 年前
王知无-import_bigdata

Kafka常见的导致重复消费原因和解决方案

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
王知无-import_bigdata
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > Kafka常见的导致重复消费原因和解决方案

Kafka常见的导致重复消费原因和解决方案

作者头像
王知无-import_bigdata
发布 于 2020-07-21 14:10:24
22.2K 0
发布 于 2020-07-21 14:10:24
举报
文章被收录于专栏: 大数据成神之路 大数据成神之路

问题分析

导致kafka的重复消费问题原因在于,已经消费了数据,但是offset没来得及提交(比如Kafka没有或者不知道该数据已经被消费)。 总结以下场景导致Kakfa重复消费:

  • 原因1:强行kill线程,导致消费后的数据,offset没有提交(消费系统宕机、重启等)。
  • 原因2:设置offset为自动提交,关闭kafka时,如果在close之前,调用 consumer.unsubscribe() 则有可能部分offset没提交,下次重启会重复消费。

例如:

代码语言: javascript
复制
try {
    consumer.unsubscribe();
} catch (Exception e) {
try {
    consumer.close();
} catch (Exception e) {
}

上面代码会导致部分offset没提交,下次启动时会重复消费。

解决方法:设置offset自动提交为false

整合了Spring配置的修改如下配置 spring配置:

代码语言: javascript
复制
spring.kafka.consumer.enable-auto-commit=false
spring.kafka.consumer.auto-offset-reset=latest

整合了API方式的修改enable.auto.commit为false API配置:

代码语言: javascript
复制
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test");
props.put("enable.auto.commit", "false");

一旦设置了 enable.auto.commit 为 true,Kafka 会保证在开始调用 poll 方法时,提交上次 poll 返回的所有消息。从顺序上来说,poll 方法的逻辑是先提交上一批消息的位移,再处理下一批消息,因此它能保证不出现消费丢失的情况。

  • 原因3:(重复消费最常见的原因):消费后的数据,当offset还没有提交时,partition就断开连接。比如,通常会遇到消费的数据,处理很耗时,导致超过了Kafka的session timeout时间(0.10.x版本默认是30秒),那么就会re-blance重平衡,此时有一定几率offset没提交,会导致重平衡后重复消费。
  • 原因4:当消费者重新分配partition的时候,可能出现从头开始消费的情况,导致重发问题。
  • 原因5:当消费者消费的速度很慢的时候,可能在一个session周期内还未完成,导致心跳机制检测报告出问题。
  • 原因6:并发很大,可能在规定的时间(session.time.out默认30s)内没有消费完,就会可能导致reblance重平衡,导致一部分offset自动提交失败,然后重平衡后重复消费

问题描述: 我们系统压测过程中出现下面问题:异常rebalance,而且平均间隔3到5分钟就会触发rebalance,分析日志发现比较严重。错误日志如下:

代码语言: javascript
复制
08-09 11:01:11 131 pool-7-thread-3 ERROR [] - 
commit failed 
org.apache.kafka.clients.consumer.CommitFailedException: Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member. This means that the time between subsequent calls to poll() was longer than the configured max.poll.interval.ms, which typically implies that the poll loop is spending too much time message processing. You can address this either by increasing the session timeout or by reducing the maximum size of batches returned in poll() with max.poll.records.
        at org.apache.kafka.clients.consumer.internals.ConsumerCoordinator.sendOffsetCommitRequest(ConsumerCoordinator.java:713) ~[MsgAgent-jar-with-dependencies.jar:na]
 
推荐文章
含蓄的大象  ·  【公布获奖】【小米用户独家福利】江湖召集令 晒角色赢好礼 - 热血江湖手游活动-小米游戏中心
8 月前
安静的斑马  ·  BT种子磁力搜索与下载网站分享 - 知乎
1 年前
聪明伶俐的大海  ·  byde5_抖抖音
1 年前
傻傻的铁链  ·  离婚后前夫成了我的忠犬动漫图片,离婚后前夫成了我的忠犬漫剧漫画视频 - 快看漫画
1 年前
阳光的墨镜  ·  一文看懂PBC、OKR、KPI,绩效管理工具选择不再迷茫 - 知乎
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号