【问题标题】:Kafka topic with Partitions带有分区的 Kafka 主题
【发布时间】:2019-02-25 01:27:56
【问题描述】:

简单的问题:

假设我有一个包含 3 个分区的主题: 主题:StateEvents P1、P2 和 P3。

我们还假设生产者生成了 20 条消息:

1, 2, 3, ....20

我的问题是:

当生产者产生这些消息时:

1) 每条消息是否仅在 1 个分区中?也就是说,P1 中 1 个,P2 中 2 个,P3 中 3 个,然后 P1 中 4 个,P2 中 5 个,P3 中 6 个等等?

2) 如果 #1 为真,当消费者订阅时,它会订阅所有分区,以便获取所有消息?

谢谢

【问题讨论】:

    标签: apache-kafka kafka-consumer-api


    【解决方案1】:
    1. 是的,每条消息只写入一个分区。

    2. 单个消费者订阅kafka topic(有多个partition)时,会从所有partition中读取消息。但是,如果您使用相同的消费者 group.id 运行多个消费者,每个消费者将从不同的不同分区中读取。

    假设一个 kafka 主题有 3 个分区,并且您有 3 个具有相同 group.id 的消费者。每个消费者将从 1-1 个分区中读取。但是如果只有一个消费者,它将从所有 3 个分区中读取。

    【讨论】:

    • 谢谢尼修。感谢快速响应。对于您所做的多个消费者(在消费者组中)点(每个消费者将获得消息的“子集”,因为每个消费者都连接到单个分区),这不是每个消费者都会的“缺点”吗?没有从主题中获取所有消息?也许,您可以给我一个很好的用例吗?谢谢
    • 不,这不是缺点。如果您想分担负载并加快处理速度,这将非常有用。
    • 谢谢尼修。我了解更快的处理方面,但如果消费者试图获取分区中的所有消息都在同一个消费者组中,那么这是一个劣势。发布者将消息推送到具有多个分区的主题并且多个消费者正在消费其中的事件的用例是什么?请记住,这种情况下的消费者不会获得该主题的所有消息。
    • @Asim 每个唯一的消费者组 id 都会收到所有消息
    • @Asim :正如 cricket_007 也提到的那样。消费者是消费者群体的一部分。因此,无论有多少消费者进入该组,每个消费者组都会收到所有消息。
    【解决方案2】:

    1) 目标分区由生产者决定。使用默认的分区算法(可以自定义),目标分区是:hash(message-key) % num_partitions。这意味着具有相同键的所有消息都进入同一个分区。因此,如果您使用一个密钥并且所有消息都具有相同的密钥,那么它们将进入同一个分区。如果未指定密钥,则使用循环。在任何情况下,一条消息总是只发送到一个分区。

    2) 如果consumer是consumer group中的唯一一个consumer,它将获取所有的partition。您可以在同一个消费者组中添加更多消费者以分担负载(在您的情况下最多 3 个消费者,这是您在主题中拥有的分区数,因此一个消费者获得一个分区)。

    让不同的消费者从不同的分区获取消息是 Kafka 很好地扩展的方式。这不是一个缺点,因为您必须考虑消费应用程序(由多个消费者制作)。应用程序标识符可以是其所有消费者使用的组 ID:您让应用程序从主题中获取所有消息,但负载分散在其消费者之间。

    【讨论】:

      【解决方案3】:

      每条消息只会发送到一个分区

      如果key不为null,则按照配置中实现的分区方法进行分区ID计算。 这是源代码

      class DefaultPartitioner(props: VerifiableProperties = null) extends Partitioner {
        private val random = new java.util.Random
      
        def partition(key: Any, numPartitions: Int): Int = {
          Utils.abs(key.hashCode) % numPartitions
        }
      }
      

      为了保证同类型的消息顺序(FIFO),一个partition只能被同一个group的一个consumer消费,不同group的consumer可以绑定同一个partition重复消费。 但一个消费者可以使用多个分区。

      【讨论】:

        猜你喜欢
        • 2016-10-01
        • 2016-04-19
        • 2015-03-05
        • 1970-01-01
        • 2018-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多