Kafka重复消费原因

底层根本原因:已经消费了数据,但是offset没提交。

原因1:强行kill线程,导致消费后的数据,offset没有提交。

原因2:设置offset为自动提交,关闭kafka时,如果在close之前,调用 consumer.unsubscribe() 则有可能部分offset没提交,下次重启会重复消费。例如:

try {

consumer.unsubscribe();

} catch (Exception e) {

}

try {

consumer.close();

} catch (Exception e) {

}

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

Kafka Consumer丢失数据原因

猜测:设置offset为自动定时提交,当offset被自动定时提交时,数据还在内存中未处理,此时刚好把线程kill掉,那么offset已经提交,但是数据未处理,导致这部分内存中的数据丢失。

记录offset和恢复offset的方案

理论上记录offset,下一个group consumer可以接着记录的offset位置继续消费。

offset记录方案:

每次消费时更新每个topic+partition位置的offset在内存中,

Map<key, value>,key=topic+'-'+partition,value=offset

当调用关闭consumer线程时,把上面Map的offset数据记录到 文件中*(分布式集群可能要记录到redis中)。

下一次启动consumer,需要读取上一次的offset信息,方法是 以当前的topic+partition为key,从上次的Map中去寻找offset。

然后使用consumer.seek()方法指定到上次的offset位置。

说明:

1、该方案针对单台服务器比较简单,直接把offset记录到本地文件中即可,但是对于多台服务器集群,offset也要记录到同一个地方,并且需要做去重处理。

如果线上程序是由多台服务器组成的集群,是否可以用一台服务器来支撑?应该可以,只是消费慢一点,没多大影响。

2、如何保证接着offset消费的数据正确性

为了确保consumer消费的数据一定是接着上一次consumer消费的数据,

consumer消费时,记录第一次取出的数据,将其offset和上次consumer最后消费的offset进行对比,如果相同则继续消费。如果不同,则停止消费,检查原因。

最新文章

  1. 关闭form上chrome的autofill
  2. Openvswitch原理与代码分析(7): 添加一条流表flow
  3. 通过发布项目到IIS上,登录访问报系统找不到System.Web.Mvc
  4. 51NOD 1400 序列分解
  5. [转] java编程规范
  6. Cheatsheet: 2013 12.01 ~ 12.16
  7. easyui中jquery重复引用问题(tab内存泄露问题)
  8. Java 坦克小游戏心得
  9. JQuery 在$(window).load() 事件中 不运行 $(window).resize()
  10. 后台邮箱配置SMTP函数,如何把发件人设置为自定义昵称
  11. Layui的一点小理解(上)
  12. C# 方法扩展
  13. 容器化-Docker实战
  14. JS原生 未来元素监听写法
  15. linux中ping带时间及打印内容到文件
  16. Python3 系列之 编程规范篇
  17. Django----From组件
  18. VI编辑器常用命令
  19. PAT 1035 插入与归并(25)(代码+思路+测试点分析)
  20. shell黑名单

热门文章

  1. HTML插入Flash的全兼容完美解决方案-SWFObject
  2. Spring aop——前置增强和后置增强 使用注解Aspect和非侵入式配置
  3. setTimeout注意事项
  4. 自定义UIPageControl,可设置任意图片image。
  5. AS错误:Error:Execution failed for task &#39;:gM99SDK:processReleaseResources&#39;. &gt; com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process &#39;command &#39;F:\BaiduYunDown
  6. jsp学习--如何定位错误和JSP和Servlet的比较
  7. shell脚本批量处理字符串
  8. Jfinal 使用 JsonKit 转换不了问题
  9. c# (nop中)下拉列表(有外键)
  10. 基本套接字编程(2) -- I/O模型篇