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?
答案 0 :(得分:1)
Kafka使用者不是线程安全的,您不应在不同线程之间共享同一使用者实例。相反,您应该为每个线程创建新实例。
1。每个线程一个消费者
一个简单的选择是为每个线程提供自己的使用者实例。这是这种方法的优缺点:
- PRO:这是最容易实现的
- PRO:由于不需要线程间协调,因此通常是最快的
- PRO:这使得按分区进行有序处理非常容易实现(每个线程仅按照接收消息的顺序处理消息)。
- CON:更多使用者表示与群集的TCP连接更多(每个线程一个)。通常,Kafka非常有效地处理连接,因此通常 成本低。
- CON:多个使用者意味着更多请求被发送到 服务器和少量的数据批处理可能会导致一些 I / O吞吐量下降。
- CON:所有进程中的线程总数将受分区总数的限制。
如果主题具有多个分区,则可以并行处理来自不同分区的消息。您可以创建几个具有相同group.id的使用者实例,每个使用者都将获得分区的一部分以使用数据。
Kafka不支持跨不同主题的并行处理。我的意思是说,不能在不同主题之间管理组,来自不同主题的分区可能无法平均分配。
答案 1 :(得分:0)
一个使用者不应超过分区。否则,无法保证消息的顺序,并且无法使用消费者偏移量的存储方式。部分由于这个原因,Kafka(Java)生产者/消费者不是线程安全的。
因此在Kafka情况下,分区数是您的并行性。
因此,在您的情况下,具有一个分区,在一个线程中恰好运行一个消费者,并在一个线程中恰好运行一个消费者实例(您可以确保将消息发送给池中的某些线程以供以后处理)