Kafka:单消费者组,无分区,多主题

Kafka: Single consumer group, no partitions and multiple topics

我有 22 个主题,主题内的顺序对我来说很重要。我没有任何分区。
基本上我有 11 个租户,每个租户需要两个主题。
我很困惑是所有 22 个主题都有一个消费者组还是有 22 个消费者组?
负载不大,消费也不是实时的,它是一个离线过程,所以几毫秒的延迟不会造成伤害。

我对以下几点感到困惑:
1. 如果我有 one 消费者组和 one 消费者 运行 在 single 机器上(JVM - Spring 引导应用程序),消费者会使用单个线程处理所有主题,还是每个主题都有单独的线程?如果是单线程,线程可能会过载。如果有多个线程,我将能够在不旋转另一台机器的情况下实现并行性(利用所有内核)。
2. 如果我有 一个 消费者组在 multiple[=31] 上与 multiple 消费者 运行 一起收听所有主题=] 机器(多个 JVM - Spring 启动应用程序),Zookeeper 是否会将来自不同主题的负载分配到不同的机器?我知道来自一个主题的消息将始终发送到一台机器。

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

它是否以这种方式工作(假设所有主题的负载相同)?
2 台机器 -> 每台机器来自大约 11 个主题的消息
4 台机器 -> 每台机器大约 5 个主题的消息等等。

首先澄清一下概念:

  • 主题只是一个逻辑单元。
  • 消息仅在分区中排序。
  • "I do not have any partitions." 是不可能的。主题必须在 至少一个分区。
  • 消费者组仅用于横向扩展。如果你有 5 您主题中的分区和同一消费者中的 5 个消费者 团体。然后Kafka将每个partition分配给一个consumer并消费 进程并行工作。

您问题的答案:

  1. 如果你有一个消费者,那么就会有一个线程(Kafka 消费者不是线程安全的),如果你需要并行,你需要在主题中有多个分区,并且同一消费者组中有相同数量的消费者。一个消费者可以订阅多个主题。
  2. 消费者端没有使用Zookeeper。 (看看)但是Kafka把分区均匀的分配给消费者。默认情况下,Kafka 保证向消费者公平分配分区负载。

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

will the consumer work with all topics using a single thread or will there be separate thread per topic?

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

The Kafka consumer is NOT thread-safe. All network I/O happens in the thread of the application making the call. It is the responsibility of the user to ensure that multi-threaded access is properly synchronized. Un-synchronized access will result in ConcurrentModificationException.


If I have one consumer group listening to all topics with multiple consumers running on multiple machines ... will the Zookeeper distribute the load from different topics to different machines?

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

请注意:Kafka 对机器一无所知,它了解消费者群体和消费者。


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

I am confused about whether to have a single consumer group for all 22 topics or have 22 consumer groups?

由于每个主题只有一个分区,因此有 22 个具有相同 group.id 的消费者或有 22 个消费者每个只订阅一个主题是一回事,因为:

each partition is assigned to exactly one consumer in the group.