kafka consumer防止数据丢失
来源:互联网 发布:如何打开windows防火墙 编辑:程序博客网 时间:2024/06/01 10:43
kafka最初是被LinkedIn设计用来处理log的分布式消息系统,因此它的着眼点不在数据的安全性(log偶尔丢几条无所谓),换句话说kafka并不能完全保证数据不丢失。
尽管kafka官网声称能够保证at-least-once,但如果consumer进程数小于partition_num,这个结论不一定成立。
考虑这样一个case,partiton_num=2,启动一个consumer进程订阅这个topic,对应的,stream_num设为2,也就是说启两个线程并行处理message。
如果auto.commit.enable=true,当consumer fetch了一些数据但还没有完全处理掉的时候,刚好到commit interval出发了提交offset操作,接着consumer crash掉了。这时已经fetch的数据还没有处理完成但已经被commit掉,因此没有机会再次被处理,数据丢失。
如果auto.commit.enable=false,假设consumer的两个fetcher各自拿了一条数据,并且由两个线程同时处理,这时线程t1处理完partition1的数据,手动提交offset,这里需要着重说明的是,当手动执行commit的时候,实际上是对这个consumer进程所占有的所有partition进行commit,kafka暂时还没有提供更细粒度的commit方式,也就是说,即使t2没有处理完partition2的数据,offset也被t1提交掉了。如果这时consumer crash掉,t2正在处理的这条数据就丢失了。
如果希望能够严格的不丢数据,解决办法有两个:
- 手动commit offset,并针对partition_num启同样数目的consumer进程,这样就能保证一个consumer进程占有一个partition,commit offset的时候不会影响别的partition的offset。但这个方法比较局限,因为partition和consumer进程的数目必须严格对应。
- 另一个方法同样需要手动commit offset,另外在consumer端再将所有fetch到的数据缓存到queue里,当把queue里所有的数据处理完之后,再批量提交offset,这样就能保证只有处理完的数据才被commit。当然这只是基本思路,实际上操作起来不是这么简单,具体做法以后我再另开一篇。
- kafka consumer防止数据丢失
- kafka consumer防止数据丢失
- kafka consumer
- Kafka-Consumer
- Kafka Consumer
- sparkStreaming Kafka数据丢失问题
- 如何防止网站数据丢失
- Kafka之Consumer获取消费数据全过程图解
- kafka重置consumer的offset 数据重复消费
- 使用nodejs对kafka、zookeeper数据进行消费consumer
- kafka connect到底会不会重写/丢失数据
- Kafka重复消费和丢失数据研究
- spark kafka 零数据丢失-----java版
- Sparkstream kafka 数据零丢失方案
- kafka mq consumer
- kafka consumer group总结
- Kafka Consumer接口
- kafka的consumer接口
- java toString()方法以及重写的意义
- 二叉树前序,中序,后序遍历详解
- magnolia start
- HINSTANCE
- webpack-3 react-router-4 react-15.6 升级记录
- kafka consumer防止数据丢失
- 机器学习中的算法-支持向量机(SVM)基础
- linux下的bash shell
- 编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)。不在范围内的不作统计。
- SpringBoot多依赖模块应用中,如何处理多数据源的主数据源位置
- android activity转场动画(不兼容5.0一下)
- 对象实例化过程
- 命令模式
- java 将Date类型转换为String类型