以0.10.2.1版本为主分析kafka源码。如有分析不当之处,还望留言指出,相互学习,谢谢!。
1、目前kafak的消费者连接器只有一种基于zookeeper的
老版本中的消费者只有两个方法:根据配置文件创建消费者连接器
创建基于java的连接器,其实还是zookeeper的
消费者连接器内部通过调用consume方法创建数据流。核心主要放在consume方法内部。
consume方法实现如下:
内部定义了多种数据结构:
topicThreadIds:指的是每个主题对于了所有线程id topic-->threadIds.
queuesAndStreams:每个线程对应了产生一个元祖,元祖内容为(队列,kafka数据流)。
topicCount主要根据用户传进去的主题和线程个数构建一个主题和线程ID(一个线程个数就是一个线程ID)
该方法内部主要有三个实现;
1、注册消费者:
registerConsumerInZk。(在消费者组临时目录下创建一个消费者路径)。
allQueuesAndStreams根据类型进行模式匹配,有多个主题对于的队列数据流就展开返回所有的队列数据流,如果只是一个主题,则直接返回就可以了。
allQueueAndStreams:===》(queue,stream)
zip操作之后数据结构。
threadQueueStreamPairs===> ((topic,threadId),(queue,stream))。
下面这部分代码主要是构建一个线程Id---》queue之间的映射。初始化内部的数据结构topicThreadIdAndqueues--》((topic,threadId),queue)
下面这部分代码主要是首先根据topic排序。数据结构还是他threadQueueStreamPairs===> ((topic,threadId),(queue,stream))。
这部分代码主要用于初始化topicStreamsMap构建 topic---->streams的数据结构。
让监听器监听制定目录下的数据变化,让创建的监听器起作用
最后一部,数据结构初始化之后就开始再平衡操作。
小结:
重新初始化其实做
1、 创建监听器并让其起作用
2、初始化数据结构
3、再平衡操作
前面1,2两个已经分析,看再平衡怎么做的。