制作人如何找到kafka读者

时间:2018-03-23 06:10:08

标签: apache-kafka

制作人通过设置Kafka Broker列表来发送消息,如下所示。

props.put("bootstrap.servers", "127.0.0.1:9092,127.0.0.1:9092,127.0.0.1:9092");

我想知道“制作人”如何知道哪三个经纪人知道哪个拥有分区领导者。 对于典型的分布式服务器,要么您有一个承载服务器,要么具有虚拟IP,但对于Kafka,它是如何加载的? 生产者程序是否尝试随机连接到一个代理并寻找具有分区负责人的代理?

2 个答案:

答案 0 :(得分:3)

Kafka群集包含多个代理实例。在任何给定时间,正好一个代理是领导者,而其余代理是包含复制数据的同步副本(ISR)。当领导经纪人意外撤职时,其中一个ISR成为领导者。

Kafka使用ZooKeeper选择一个经纪人的分区副本作为领导者。当生产者向主题中的分区发布消息时,它将被转发给其领导者。

根据Kafka documentation

  

日志的分区分布在服务器中   Kafka集群,每个服务器处理数据和共享请求   分区。每个分区都在可配置的位置进行复制   容错的服务器数量。

     

每个分区都有一个服务器充当“领导者”,零或   更多服务器充当“粉丝”。领导者处理所有阅读和   被动地跟随者写入分区请求   复制领导者。如果领导者失败,其中一个粉丝将会   自动成为新的领导者。每个服务器充当领导者   它的一些分区和其他人的追随者因此负载很好   在集群内平衡。

您可以使用this piece of code.

找到主题和分区负责人

修改

生产者向配置生产者时提供的经纪人之一发送带有主题列表的元请求。

来自代理的响应包含这些主题中的分区列表以及每个分区的前导。生产者缓存此信息,因此,它知道重定向消息的位置。

答案 1 :(得分:1)

这是一个很老的问题,但我有同样的问题,经过研究,我想分享答案,因为我希望它可以帮助其他人。

  • 为了确定分区的领导者,生产者使用一种称为元数据请求的请求类型,其中包括生产者感兴趣的主题列表。
  • 代理将响应指定主题中存在哪些分区、每个分区的副本以及哪个副本是领导者。
  • 元数据请求可以发送到任何代理,因为所有代理都有一个包含此信息的元数据缓存。