(一)、消费者连接器如何创建数据流=====》消费者初始化

以0.10.2.1版本为主分析kafka源码。如有分析不当之处,还望留言指出,相互学习,谢谢!。

1、目前kafak的消费者连接器只有一种基于zookeeper的

    老版本中的消费者只有两个方法:根据配置文件创建消费者连接器(一)、消费者连接器如何创建数据流=====》消费者初始化_第1张图片

  创建基于java的连接器,其实还是zookeeper的

消费者连接器内部通过调用consume方法创建数据流。核心主要放在consume方法内部。

(一)、消费者连接器如何创建数据流=====》消费者初始化_第2张图片

consume方法实现如下:

(一)、消费者连接器如何创建数据流=====》消费者初始化_第3张图片

内部定义了多种数据结构:

    topicThreadIds:指的是每个主题对于了所有线程id     topic-->threadIds.

   queuesAndStreams:每个线程对应了产生一个元祖,元祖内容为(队列,kafka数据流)。

        topicCount主要根据用户传进去的主题和线程个数构建一个主题和线程ID(一个线程个数就是一个线程ID)

该方法内部主要有三个实现;

    1、注册消费者:

        registerConsumerInZk。(在消费者组临时目录下创建一个消费者路径)。

(一)、消费者连接器如何创建数据流=====》消费者初始化_第4张图片

(一)、消费者连接器如何创建数据流=====》消费者初始化_第5张图片

allQueuesAndStreams根据类型进行模式匹配,有多个主题对于的队列数据流就展开返回所有的队列数据流,如果只是一个主题,则直接返回就可以了。

allQueueAndStreams:===》(queue,stream)

zip操作之后数据结构。

  threadQueueStreamPairs===>  ((topic,threadId),(queue,stream))。

下面这部分代码主要是构建一个线程Id---》queue之间的映射。初始化内部的数据结构topicThreadIdAndqueues--》((topic,threadId),queue)

(一)、消费者连接器如何创建数据流=====》消费者初始化_第6张图片

下面这部分代码主要是首先根据topic排序。数据结构还是他threadQueueStreamPairs===>  ((topic,threadId),(queue,stream))。

这部分代码主要用于初始化topicStreamsMap构建  topic---->streams的数据结构。

(一)、消费者连接器如何创建数据流=====》消费者初始化_第7张图片

让监听器监听制定目录下的数据变化,让创建的监听器起作用

(一)、消费者连接器如何创建数据流=====》消费者初始化_第8张图片

最后一部,数据结构初始化之后就开始再平衡操作。

小结:

        重新初始化其实做

           1、 创建监听器并让其起作用

           2、初始化数据结构

           3、再平衡操作

前面1,2两个已经分析,看再平衡怎么做的。

你可能感兴趣的:(kafka源码)