Kafka:单个消费者组,没有分区和多个主题

时间:2020-01-16 12:38:06

标签: java multithreading spring-boot apache-kafka message-queue

我有22个主题,主题中的顺序对我很重要。我没有任何分区。
基本上我有11个租户,每个租户需要两个主题。
对于所有22个主题都只有一个消费群体还是22个消费群体感到困惑?
负载不多,消耗不是实时的,它是一个脱机过程,因此几毫秒的延迟不会受到影响。

我对以下几点感到困惑:
1.如果我有一个消费者组,并且一个消费者在单个机器(JVM-Spring Boot Application)上运行,该消费者将与所有主题都使用一个主题,还是每个主题都有单独的主题?如果是单线程,则该线程可能会过载。如果有多个线程,我将能够实现并行性(利用所有内核),而无需旋转另一台机器。
2.如果我有一个使用者组,并且正在多个机器(多个JVM-Spring Boot应用程序)上运行的多个使用者,正在听所有主题, Zookeeper将负载从不同的主题分配到不同的计算机?我知道来自一个主题的消息将始终发送到一台计算机上。

例如: 如果有2个使用者(每台机器一个),则一个消费者小组将收听所有22个主题,并且如果这22个主题同时产生消息,它们是否会在2台机器之间分配,例如,主题1-11中的消息会转到一号机,从主题12-22转到二号机?我只是对负载分配感兴趣。

它是否以此方式工作(假设所有主题的负载相等)?
2台机器->每台机器大约11个主题发出的消息
4台计算机->每台计算机上大约5个主题发出的消息,依此类推。

2 个答案:

答案 0 :(得分:1)

首先要澄清概念:

  • 主题只是一个逻辑单元。
  • 仅在分区中排序消息。
  • “我没有任何分区。”不可能。一个主题必须有 至少一个分区。
  • Consumer组仅用于水平可伸缩性。如果你有5 您主题中的分区以及同一使用者中的5个使用者 组。然后,Kafka将每个分区分配给使用者并使用 过程并行进行。

回答您的问题:

  1. 如果有一个使用者,那么将只有一个线程(Kafka使用者不是线程安全的),如果需要并行处理,则需要在主题上拥有多个分区,并且在同一使用者组中具有相同数量的使用者。消费者可以订阅多个主题。
  2. 在消费者方面没有使用Zookeeper。 (请看this),但Kafka将分区平均分配给消费者。默认情况下,Kafka保证将分区公平分配给使用者。

**也许this视频有助于更好地理解一些核心概念。

答案 1 :(得分:1)

使用者将使用单个主题处理所有主题吗?还是每个主题都有单独的主题?

答案是使用单个线程,因为KafkaConsumer文档说:

Kafka使用者不是线程安全的。所有网络I / O都发生在进行调用的应用程序线程中。用户有责任确保正确同步多线程访问。不同步的访问将导致ConcurrentModificationException。


如果我有一个消费者组在多个用户在多台计算机上运行的同时听所有主题,那么Zookeeper会将负载从不同主题分布到不同计算机上吗?

是的,尽管不是Zookeeper负责此操作的组件。

仅需注意:卡夫卡对机器一无所知,对消费者群体和消费者一无所知。


现在,让我们回答主要问题。

对于所有22个主题都拥有一个消费群体还是22个消费群体,我感到困惑。

由于每个主题只有一个分区,因此具有22个使用者具有相同的group.id或22个使用者都仅订阅一个主题是相同的,因为:

每个分区都恰好分配给组中的一个使用者。