九 assign和subscribe
1 subscribe: 自动安排分区, 通过group自动重新的负载均衡;
- 关于Group的实验: 如果auto commit = true, 重新启动进程,如果是同样的groupID,从上次commit的地方开始消费数据,但是如果换了group后,就可以继续 消费了。
- auto commit = true, 多个consumer是同一个group,并且consumer是同时创建的,同时消费: 不出现重复消费的现象。
- auto commit = true, 多个consumer是同一个group, 但是多个consumer的启动有时间间隔,一般也不会出现重复消费数据的情况。
- auto commit = false,多个consumer是同一个group, 但是启动有间隔, 会出现重复消费的情况,即使同一个consumer都会出现重复。
因为本地存了offset,在进程没重启之前,应该是不会消费重复数据,但是为什么会导致有重复数据呢?猜测是因为,每隔一段时间有
consumer加进来,导致rebalance, offset混乱导致?(仅仅猜测)
- auto commit = false, 多个consumers同时创建,是同一个group, 没有发现重复的数据。因为是同时创建,是在消费之前就有了,不用rebalance,所以不会重复消 费数据。
- auto commit = false,一个consumer执行完3个poll,然后close consumer, 再启动下一个(也就是多个consumer串行),可以重复消费。
总结: 通过以上test cases发现, 只要是auto commit = false, 并且在消费过程中,因为consumer个数的变化,就会导致有一些数据重复消费。这是因为本地保存了offset,但是没有提交到server,rebalance会导致重复消费。
假设进程A正在消费分区1的信息,并提交了偏移量,之后又消费了10条数据,还没来得及提交偏移量的时候,reblance机制让进程B来继续消费分区1的信息, 此时进程B会从上次进程A提交偏移量的地方开始消费,因此这10条数据就是重复消费的。
当reblance比较频繁的时候,就会造成大量数据的重复。 因为kafka的offset下标的记录实际会有两份,服务端会自己记录一份,本地的消费者客户端也会记录一份,提交的offset会告诉服务端已经消费到这了,
但是本地的还没有提交的(应该是保存在进程中)并不会因此而改变offset进行再次消费。
2 assign:
手动指定消费的分区(用户指定分区);不支持group的自动负载均衡(因为分区已经指定了,就不会在consumer之间负载均衡了);
assign不会叠加,后一个会覆盖前一个(调用assign两次,后一个覆盖前一个);
多个同样配置的consumer同时消费同一个分区:
- earliest,auto commit = false: 多个consumer同时创建,是同一组, 消费同一个分区,会重复消费,因为组根本没意义。 如果此时继续
- producer新消息, 也是重复消费。
- earliest:auto commit = false: 多个consumer间隔创建,是同一组, 消费同一个分区,会重复消费,因为组根本没意义。如果此时继续
- producer新消息, 也是重复消费。
- auto commit = true这个配置不起作用, 每次还能从头消费,证明没有commit。
auto commit 对assign不起作用,实验一下consumer.commitSync()函数:
- poll完commit: 多个consumer同时创建,是同一组, 消费同一个分区,会重复消费,因为consumer同时创建,同时读取, commit还没来得及保存到server,所以重复消费。
- earliest, poll完commit: 多个consumer间隔创建,是同一组, 消费同一个分区,不会重复消费,因为consumer不是同时的,先commit的consumer是可以提交到server的,后面的就不会重复消费了。
auto.offset.reset值含义解释:
- earliest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
- latest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
- none:topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
offset commit是在Consumer端进行的操作,将下一次消费的位置(本次poll/准确的说是fetch?的最大record的后一位)commit到服务器。
有两种commit方式:自动提交与手动提交。
设置参数 props.put("enable.auto.commit", "true");开启自动提交,这样在执行poll命令后会立即将下一个offset提交至服务器。 另外,也可以通过seek函数手动控制Consumer的position(即设置poll时的起始offset),这样就可以跳过一些数据或者获取一些历史数据:(注意使用seek设置指定partition的offset时该Consumer必须要先assign订阅了该partition。)
九 assign和subscribe的更多相关文章
- KafkaConsumer assign VS subscribe
背景 在kafka中,正常情况下,同一个group.id下的不同消费者不会消费同样的partition,也即某个partition在任何时刻都只能被具有相同group.id的consumer中的一个消 ...
- kafka consumer assign 和 subscribe模式差异分析
转载请注明原创地址:http://www.cnblogs.com/dongxiao-yang/p/7200971.html 最近需要研究flink-connector-kafka的消费行为,发现fli ...
- 利用Kafka的Assign模式实现超大群组(10万+)消息推送
引言 IM即时通信场景下,最重要的一个能力就是推送:在线的直接通过长连接网关服务转发,离线的通过APNS或者极光等系统进行推送. 本文主要是针对在线用户推送场景来进行总结和探讨:如何利用Kafka ...
- Redux你的Angular 2应用--ngRx使用体验
Angular2和Rx的相关知识可以看我的Angular 2.0 从0到1系列第一节:Angular 2.0 从0到1 (一)第二节:Angular 2.0 从0到1 (二)第三节:Angular 2 ...
- Streaming结合Kafka
Spark2.11 两种流操作 + Kafka Spark2.x 自从引入了 Structured Streaming 后,未来数据操作将逐步转化到 DataFrame/DataSet,以下将介绍 S ...
- Python 使用python-kafka类库开发kafka生产者&消费者&客户端
使用python-kafka类库开发kafka生产者&消费者&客户端 By: 授客 QQ:1033553122 1.测试环境 python 3.4 zookeeper- ...
- Structured Streaming教程(3) —— 与Kafka的集成
Structured Streaming最主要的生产环境应用场景就是配合kafka做实时处理,不过在Strucured Streaming中kafka的版本要求相对搞一些,只支持0.10及以上的版本. ...
- python网络编程--RabbitMQ
一:RabbitMQ介绍 RabbitMQ是AMPQ(高级消息协议队列)的标准实现.也就是说是一种消息队列. 二:RabbitMQ和线程进程queue区别 线程queue:不能跨进程,只能用于多个线程 ...
- Kafka:Consumer
1.预览 1.1 消费者组(Consumer Group) 一个consumer group可能有若干个consumer实例 同一个group里面,topic的每条信息只能被发送到group下的一个c ...
随机推荐
- 求小于等于k长度的最大区间和
题意 给出一个序列,求长度小于等于k的最大区间和并输出起点和终点 1<=n<=100000 1<=k<=n 题解:先算出前缀和,利用单调队列的性质,在单调队列中存储sum[ ...
- C++11_ tuple
版权声明:本文为博主原创文章,未经博主允许不得转载. tuple 是一个可以装载任何变量的容器,C++11的Variadic Templates给tuple的实现带来了极大方便. tuple的实现基于 ...
- Join, Group Join
Linq的 Join对应SQL中的inner join,当左右两张表有匹配数据时才返回一条记录: Linq的 Group Join对应SQL中的LEFT OUTER JOIN,即使右表中没有匹配,也从 ...
- weblogic、hibernate 包冲突
解决办法: 在weblogic 配置 [paths]项中 添加antlr-2.7.7.jar,该jar包应该位于引用weblogic.jar之前,使启动时不再加载weblogic中的低版本的antl ...
- 在Golang中获取系统的磁盘空间内存占用
获取磁盘占用情况(Linux/Mac下有效) import ( "syscall" ) type DiskStatus struct { All uint64 `json:&quo ...
- 程序设计入门-C语言基础知识-翁恺-第四周:循环控制-详细笔记(四)
目录 第四周:循环控制 4-1 for循环 4-2 循环控制 各运算符优先级(图) 4-3 课后习题 4-4 讨论题 第四周:循环控制 4-1 for循环 for循环像一个计数循环:设定一个计数器,初 ...
- 21天学通C++_Day5
昨天停更了一天,真是羞羞啊,不过还是干了很多有意义的事的! 首先,昨天下午的时候,去参加了学校的春招!第一次参加招聘会,怕自己答不上面试官的问题,很是紧张! 和同学约的一点,结果到了发现还没开始,只能 ...
- 使用POI对excel进行操作生成二维数组
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- BZOJ4036:按位或 (min_max容斥&高维前缀和)
Description 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal 的or)操作.选择数字i的概率是p[i].保证0&l ...
- 每天一个linux命令(性能、优化):【转载】top命令
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top是一个动态显示过程,即可以通过用户按键来不断刷新 ...