【问题标题】:Kafka: Single consumer group, no partitions and multiple topicsKafka:单个消费者组,无分区和多个主题
【发布时间】:2020-05-03 07:28:38
【问题描述】:

我有 22 个主题,一个主题中的顺序对我来说很重要。我没有任何分区。
基本上我有 11 个租户,每个租户需要两个主题。
我对是否为所有 22 个主题拥有一个消费者组或拥有 22 个消费者组感到困惑?
负载不多,消耗不是实时的,是离线进程,所以延迟几毫秒也无妨。

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

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

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

【问题讨论】:

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


    【解决方案1】:

    首先理清概念:

    • 主题只是一个逻辑单元。
    • 消息仅在分区中排序。
    • “我没有任何分区。”不可能。一个主题必须有 至少一个分区。
    • 消费者组仅用于水平可扩展性。如果你有 5 您的主题中的分区和同一消费者中的 5 个消费者 团体。然后Kafka将每个分区分配给一个消费者并消费 进程并行工作。

    回答您的问题:

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

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

    【讨论】:

      【解决方案2】:

      消费者将使用单个线程处理所有主题,还是每个主题有单独的线程?

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

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


      如果我有一个消费者组监听所有主题,多个消费者在多台机器上运行...... Zookeeper 是否会将来自不同主题的负载分配到不同的机器上?

      是的,尽管负责这件事的组件并不是 Zookeeper。

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


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

      我很困惑是要为所有 22 个主题设置一个消费者组还是拥有 22 个消费者组?

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

      每个分区都被分配给组中的一个消费者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-17
        • 1970-01-01
        • 2017-01-26
        • 1970-01-01
        • 2022-06-14
        • 2020-06-03
        • 2018-08-31
        • 2021-11-28
        相关资源
        最近更新 更多