1、
MetaData:
//两个更新元数据的请求的最小的时间间隔,默认值是100ms
//目的就是减少网络的压力
private final long refreshBackoffMs;
//多久自动更新一次元数据,默认值是5分钟更新一次。
private final long metadataExpireMs;
//对于producer端来讲,元数据是有版本号
//每次更新元数据,都会修改一下这个版本号。
private int version;
//上一次更新元数据的时间。
private long lastRefreshMs;
//上一次成功更新元数据的时间。
//如果正常情况下,如果每次都是更新成功的,那么lastRefreshMs和lastSuccessfulRefreshMs 应该是相同的。
private long lastSuccessfulRefreshMs;
//TODO Kafka集群本身的元数据。
private Cluster cluster;
//这是一个标识,用来判断是否更新元数据的标识之一。
private boolean needUpdate;
/* Topics with expiry time */
//记录了当前已有的topics
private final Map<String, Long> topics;
private final List<Listener> listeners;
private final ClusterResourceListeners clusterResourceListeners;
private boolean needMetadataForAllTopics;
private final boolean topicExpiryEnabled;
Cluster:
private final boolean isBootstrapConfigured;
//我们一个kafka集群是有多个节点,这个参数代表的就是kafka的服务器的信息。
private final List<Node> nodes;
//没有授权的topic
private final Set<String> unauthorizedTopics;
private final Set<String> internalTopics;
/**
* 我们发现这儿搞了很多数据结构,这些数据结构里面有些数据可能是冗余的。
*/
//代表的是一个partition和partition对应的信息
//是因为partition有副本
private final Map<TopicPartition, PartitionInfo> partitionsByTopicPartition;
//一个topic 对应哪些分区
private final Map<String, List<PartitionInfo>> partitionsByTopic;
//一个topic对应哪些可用partition
private final Map<String, List<PartitionInfo>> availablePartitionsByTopic;
//一台服务器上面有哪些partition(服务器用的是服务器的编号)
private final Map<Integer, List<PartitionInfo>> partitionsByNode;
//服务器编号和服务器对应的关系
//0,Node
private final Map<Integer, Node> nodesById;
//kafka集群的id信息(不重要)
private final ClusterResource clusterResource;
/**
* 代表的就是kafka的一个节点信息
*/
public class Node {
private static final Node NO_NODE = new Node(-1, "", -1);
//id 编号,这个编号是我们配置参数的时候指定的。
private final int id;
private final String idString;
//主机名
private final String host;
//端口号,默认是9092
private final int port;
//机架
private final String rack;
public class PartitionInfo {
//主题
private final String topic;
//分区编号
private final int partition;
//leader partition 在哪台服务器上面
private final Node leader;
//这个分区的所有的replica都在哪些节点上面
private final Node[] replicas;
//ISR列表。
private final Node[] inSyncReplicas;
public final class TopicPartition implements Serializable {
private int hash = 0;
private final int partition;
private final String topic;