九 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 ...
随机推荐
- JWT的详细简介
什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场 ...
- selected多次点击不生效
表单下拉选项使用selected设置选中时,发现第一次默认选中成功,在页面不刷新的情况下操作(比如ajax),虽然selected属性设置了,但是默认选中不生效. 解决办法1 可能是浏览器缓存问题,在 ...
- Nodejs下express+ejs模板的搭建
nodejs的环境配置,这里就不做说明了.在nodejs安装后的步骤在这里说明一下 首先 全局安装express npm install -g express-generator 安装ok后,接着 ...
- css工具类封装
温馨提示:一下css封装,建议按需使用,否则会造成很大的代码冗余,且很多样式会造成不符合预期的效果,建议合理使用 <a href="https://meyerweb.com/eric/ ...
- Adobe Flash Builder 4.6 Premium 安装破解
1.到Adobe官网下载FlashBuilder 4.6,有简体中文版: 语言:简体中文(Simplified)http://trials3.adobe.com/AdobeProducts/FLBR/ ...
- sysbench工具使用
--------------需要的软件包-------------- automake libtool sysbench-1.0.zip --------------安装-------------- ...
- UESTC794 Balloon Game 博弈
题目链接:Balloon Game 题目大意: Alice 和 Bob进行一个博弈游戏,他们要摆放气球,保证颜色一样的气球全部相邻出现,现在在一个序列中气球有一部分已经摆放,还有一些未摆放,用&quo ...
- ZOJ3640Help Me Escape(师傅逃亡系列•一)(数学期望||概率DP)
Background If thou doest well, shalt thou not be accepted? and if thou doest not well, sin lieth at ...
- Luogu 1452 Beauty Contest
Luogu 1452 Beauty Contest 求平面最远点对,先求出凸包,再找凸包的直径. 使用旋转卡壳,直径一定出现在对踵点对间.比较不同点到同一直线距离可以用叉积算三角形面积来比较. 实现时 ...
- SSZipArchive使用详解
下载SSZipArchive,点击我.或者自己在这里下载. SSZipArchive功能: 解压zip文件 解压密码保护的zip文件 创建zip文件 追加到zip文件 压缩文件 使用一个名字来压缩NS ...