关于kafka:Kafka-元数据的拉取时机

元数据

生产者发消息给Kafka,是须要晓得Kafka的ip、端口等节点信息,这些节点信息是元数据的一部分,属于元数据Metadata的Cluster的一部分。

咱们每一个topic,在Kafka是分布式的模式寄存的,所以一个topic就会有多个分区,每个分区对应值着不同的ip、端口等信息。所以每个topic有多少分分区,每个分区的leader节点replica节点的ip、端口信息等,也属于元数据Metadata的Cluster的一部分。

对于生产者客户端来说,这些元数据都是Kafka的信息,所以往kafka发送音讯之前,就须要拉取元数据。

初始化

Metadata是KafkaProducer的一个属性,在KafkaProducer初始化的时候,也会实例化一个Metadata对象,可能有人感觉,实例化Metadata后,就会去拉取元数据信息。

然而kafka并没有这么做,只是对集群元数据做了一个初始化,咱们在上一篇曾经晓得KafkaProducer是有配置bootstrap.servers这个属性的。所以初始化的时候,就是把配置的地址,转换为Node,Node就存储着配置的ip和port,放在Cluster对象实例里,下面曾经说过,Cluster对象也是Metadata的属性。因为bootstrap.servers是能够配置多个的,所以在Cluster中存储的是Node列表。

所以KafkaProducer初始化的时候并没有加载元数据的,这是懒加载的编程思维。

发送时

在元数据里,咱们曾经看到Metadata的cluster寄存topic相干的信息,如果发送的时候,发现这个topic在cluster中并没有对应的信息,那就须要去拉取元数据信息。

默认状况下,咱们只拉取本人要发送音讯的对应的topic的元数据的信息,并不会拉取所有的元数据信息,所以在初始化的时候,并不会拉取元数据,因为那时候,基本不晓得生产者须要发送哪些topic。

等到下一次往这个topic发送数据的时候,间接就会从Metadata的cluster中拿数据。

某个机会

Metadata在实例化的时候,会有两个结构参数,一个读取配置config里的metadata.max.age.ms信息,默认是5分钟,这个作用是,间隔上次胜利拉取的工夫超过5分钟会刷新一下。

另外一个参数读取配置config里的retry.backoff.ms信息,默认100ms,这个作用是,间隔上一次更新元数据的工夫跟以后工夫比照,如果还没有到100ms,那就不能更新元数据,防止频繁更新。留神这里只是和上次更新的工夫比拟,并不是胜利拉取的工夫。

如果有一个拉取元数据的工作了,那就不能持续去拉取元数据。

对于能不能拉取元数据,次要还是看下面三种状况。