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的更多相关文章

  1. KafkaConsumer assign VS subscribe

    背景 在kafka中,正常情况下,同一个group.id下的不同消费者不会消费同样的partition,也即某个partition在任何时刻都只能被具有相同group.id的consumer中的一个消 ...

  2. kafka consumer assign 和 subscribe模式差异分析

    转载请注明原创地址:http://www.cnblogs.com/dongxiao-yang/p/7200971.html 最近需要研究flink-connector-kafka的消费行为,发现fli ...

  3. 利用Kafka的Assign模式实现超大群组(10万+)消息推送

    引言 IM即时通信场景下,最重要的一个能力就是推送:在线的直接通过长连接网关服务转发,离线的通过APNS或者极光等系统进行推送.   本文主要是针对在线用户推送场景来进行总结和探讨:如何利用Kafka ...

  4. Redux你的Angular 2应用--ngRx使用体验

    Angular2和Rx的相关知识可以看我的Angular 2.0 从0到1系列第一节:Angular 2.0 从0到1 (一)第二节:Angular 2.0 从0到1 (二)第三节:Angular 2 ...

  5. Streaming结合Kafka

    Spark2.11 两种流操作 + Kafka Spark2.x 自从引入了 Structured Streaming 后,未来数据操作将逐步转化到 DataFrame/DataSet,以下将介绍 S ...

  6. Python 使用python-kafka类库开发kafka生产者&消费者&客户端

    使用python-kafka类库开发kafka生产者&消费者&客户端   By: 授客 QQ:1033553122       1.测试环境 python 3.4 zookeeper- ...

  7. Structured Streaming教程(3) —— 与Kafka的集成

    Structured Streaming最主要的生产环境应用场景就是配合kafka做实时处理,不过在Strucured Streaming中kafka的版本要求相对搞一些,只支持0.10及以上的版本. ...

  8. python网络编程--RabbitMQ

    一:RabbitMQ介绍 RabbitMQ是AMPQ(高级消息协议队列)的标准实现.也就是说是一种消息队列. 二:RabbitMQ和线程进程queue区别 线程queue:不能跨进程,只能用于多个线程 ...

  9. Kafka:Consumer

    1.预览 1.1 消费者组(Consumer Group) 一个consumer group可能有若干个consumer实例 同一个group里面,topic的每条信息只能被发送到group下的一个c ...

随机推荐

  1. JWT的详细简介

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场 ...

  2. selected多次点击不生效

    表单下拉选项使用selected设置选中时,发现第一次默认选中成功,在页面不刷新的情况下操作(比如ajax),虽然selected属性设置了,但是默认选中不生效. 解决办法1 可能是浏览器缓存问题,在 ...

  3. Nodejs下express+ejs模板的搭建

    nodejs的环境配置,这里就不做说明了.在nodejs安装后的步骤在这里说明一下 首先 全局安装express  npm install -g express-generator 安装ok后,接着 ...

  4. css工具类封装

    温馨提示:一下css封装,建议按需使用,否则会造成很大的代码冗余,且很多样式会造成不符合预期的效果,建议合理使用 <a href="https://meyerweb.com/eric/ ...

  5. Adobe Flash Builder 4.6 Premium 安装破解

    1.到Adobe官网下载FlashBuilder 4.6,有简体中文版: 语言:简体中文(Simplified)http://trials3.adobe.com/AdobeProducts/FLBR/ ...

  6. sysbench工具使用

    --------------需要的软件包-------------- automake libtool sysbench-1.0.zip --------------安装-------------- ...

  7. UESTC794 Balloon Game 博弈

    题目链接:Balloon Game 题目大意: Alice 和 Bob进行一个博弈游戏,他们要摆放气球,保证颜色一样的气球全部相邻出现,现在在一个序列中气球有一部分已经摆放,还有一些未摆放,用&quo ...

  8. ZOJ3640Help Me Escape(师傅逃亡系列•一)(数学期望||概率DP)

    Background If thou doest well, shalt thou not be accepted? and if thou doest not well, sin lieth at ...

  9. Luogu 1452 Beauty Contest

    Luogu 1452 Beauty Contest 求平面最远点对,先求出凸包,再找凸包的直径. 使用旋转卡壳,直径一定出现在对踵点对间.比较不同点到同一直线距离可以用叉积算三角形面积来比较. 实现时 ...

  10. SSZipArchive使用详解

    下载SSZipArchive,点击我.或者自己在这里下载. SSZipArchive功能: 解压zip文件 解压密码保护的zip文件 创建zip文件 追加到zip文件 压缩文件 使用一个名字来压缩NS ...