apache-kafka - Apache Kafka 使用分区扩展主题

标签 apache-kafka

我们开始使用 Apache Kafka 将时间序列数据保存到时间序列数据库中。我们一开始只有一个主题,一个生产者写入这个主题,一个消费者读取这个主题并将数据转储到 Timeseries 数据库。

我们有 3 个代理实例,我们在第一次尝试中注意到生产者向主题写入消息的速度相当快。在 30 分钟内,我们收到了大约 150 万条消息。消费者每秒只处理 300 条消息。

我们的下一个方法是对主题进行分区并拥有更多的消费者实例(等于分区数)。这无疑提高了消费者写入速度。现在我的问题是:

  1. 如果我将主题分区设置为 6,但我只有 3 个代理实例,会发生什么情况。哪个代理实例将成为分区 1 到 6 的领导者?

  2. 是否有公式可以确定我需要多少个分区?由于这是我们的测试环境,我们可以使用它并对其进行扩展。我们可能无法在我们的生产环境中做同样的事情。那么如何确定分区大小呢?

最佳答案

分区在您的经纪人之间分配。不可能知道哪个代理将被选为给定分区的领导者——而且它会随着时间而改变。根据您使用的 Kafka 版本和消费者 API,您的消费者可能会也可能不会自行发现分区领导者。使用 SimpleConsumer,您必须自己找到分区领导者,并在您的代码中响应新的领导者选举(而不是由 API 自动处理)。

至于分区的数量——除此之外没有真正的“公式”:你不能拥有比分区更多的并行度。如果你有 4 个分区和 5 个消费者,其中一个消费者会饿死。对于大型主题的分区数,我通常使用 12 或 60 或其倍数之类的数字。在可变数量的消费者之间轻松、干净地划分的东西。

另请注意,您稍后可以更改分区数量,但有一些注意事项。参见 this answer有关注意事项的方式和内容。

关于apache-kafka - Apache Kafka 使用分区扩展主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36945521/

相关文章:

mongodb - 将 dockerized kafka 接收器连接器实现到 mongo

kubernetes - Kafka Producer导致org.apache.kafka.common.network.InvalidReceiveException:无效的接收

apache-kafka - Apache Kafka 分区保证中的消息顺序

apache-kafka - KafkaSpout 为 log4j 抛出 NoClassDefFoundError

java - Kafka Template 和 kafka producer 有什么区别?

java - Kafka 如何防止通过代理丢失数据

java - 绑定(bind)到多个主题的 Spring Cloud Stream Kafka 消费者

apache-kafka - 基于Kafka的Confluent Platform是免费的吗?开源?

apache-kafka - Kafka 连接,Cassandra 接收器 : How to specify the partition and clustering keys?

docker - Zookeeper重新启动后,Kafka群集丢失消息