Does Kafka do balancing the partitions to each consumer threads?

时间:2019-01-15 18:15:56

标签: apache-kafka

I have a Kafka cluster with multiple topics, I'm going to set One partition for each topic and all those topics will be consumed by a single one EC2 instance running with 3 Kafka Consumer threads (One consumer per thread), belong to same Consumer Group.

I haven't experimented it yet, but I'm wondering if the Kafka can do balancing the partitions of all topics to be consumed by 3 threads equally ? or Kafka will assign all partitions to be consumed by only one thread?

2 个答案:

答案 0 :(得分:1)

Kafka使用者不是线程安全的,您不应在不同线程之间共享同一使用者实例。相反,您应该为每个线程创建新实例。

摘自文档https://kafka.apache.org/0100/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#multithreaded

  

1。每个线程一个消费者

     

一个简单的选择是为每个线程提供自己的使用者实例。这是这种方法的优缺点:

     
      
  • PRO:这是最容易实现的
  •   
  • PRO:由于不需要线程间协调,因此通常是最快的
  •   
  • PRO:这使得按分区进行有序处理非常容易实现(每个线程仅按照接收消息的顺序处理消息)。
  •   
  • CON:更多使用者表示与群集的TCP连接更多(每个线程一个)。通常,Kafka非常有效地处理连接,因此通常   成本低。
  •   
  • CON:多个使用者意味着更多请求被发送到   服务器和少量的数据批处理可能会导致一些   I / O吞吐量下降。
  •   
  • CON:所有进程中的线程总数将受分区总数的限制。
  •   

如果主题具有多个分区,则可以并行处理来自不同分区的消息。您可以创建几个具有相同group.id的使用者实例,每个使用者都将获得分区的一部分以使用数据。

Kafka不支持跨不同主题的并行处理。我的意思是说,不能在不同主题之间管理组,来自不同主题的分区可能无法平均分配。

答案 1 :(得分:0)

一个使用者不应超过分区。否则,无法保证消息的顺序,并且无法使用消费者偏移量的存储方式。部分由于这个原因,Kafka(Java)生产者/消费者不是线程安全的。

因此在Kafka情况下,分区数是您的并行性。

因此,在您的情况下,具有一个分区,在一个线程中恰好运行一个消费者,并在一个线程中恰好运行一个消费者实例(您可以确保将消息发送给池中的某些线程以供以后处理)