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. 关于TCP/IP协议

    TCP的特点: TCP是面向连接的传输层协议 TCP的传输是可靠传输 TCP是全双工的通信 TCP的连接是点对点的传输 TCP和UDP的区别 tcp是面向连接的,两台主机的通信之前必须通过三次握手建立 ...

  2. Python基础学习----列表

      name_list=["张无忌","张三丰","张小明","胡歌","夏东海"] #循环输出na ...

  3. L157

    UK Watchdog: Smugglers to Exploit Border if no Brexit DealSmugglers and other organized criminals ar ...

  4. LINUX系统下PXE网络安装虚拟机

    PXE(preboot execute environment),预启动执行环境.由于安装系统的时候,有时候是大批量的安装:这时使用磁盘或虚拟机进行单个安装,效率太差:所以我们开始使用PXE网络安装L ...

  5. Java并发编程之读写锁

    读写锁维护了一对相关的锁,一个用于只读操作,一个用于写入操作.只要没有writer,读取锁可以由多个reader线程同时保持.写入锁是独占的. 可重入读写锁 ReentrantReadWriteLoc ...

  6. java入门学习(3)—循环,选择,基础算法,API概念

    1.顺序结构:也就是顺着程序的前后关系,依次执行.2.选择分支:利用if..else , / switch(){case [ 这个必须是常量]:}; / if..else if….. ….else.. ...

  7. URL中不应出现汉字

    浏览器会在跳转时,先将汉字编译成 Unicode,然后跳转,导致hash值改变两次,相当于history 中 加入了两次URL 

  8. 看完前任三,想起我的前任java女程序员,她曾教会我……

    前任三最近非常火了,票房蹭蹭往上升,昨天也去电影院看了,想起了我的前任,她是一名女程序员,为了让我学好java,她曾经亲自教我Java的算法,学算法是件非常重要的事,在这忍住回忆的悲伤,分享给你们. ...

  9. 一个简单的程序,统计文本文档中的单词和汉字数,逆序排列(出现频率高的排在最前面)。python实现。

    仅简单统计英文. from collections import Counter f = open('1') c = Counter() for line in f: g = (x for x in ...

  10. 可能是 BJOI2019 Day1 题解?

    T1 给一个有空白字符的串 $S$,和若干模板串 $X_i$,初始 $Ans = 1$,每当一个模板串在 $S$ 中作为子串出现时,$Ans$ 会乘以 $X_i$ 的权值 $Val_i$,然后如果 $ ...