【问题标题】:How kafka partitions behavekafka 分区的行为方式
【发布时间】:2017-07-03 12:18:22
【问题描述】:
你能解释一下 kafka 分区是如何在这种情况下工作的吗
如果我用 1 个主题和 3 个分区循环生成 9 (1-9) 条消息。
是不是意味着:
分区 1 包含:[1,4,7]
分区 2 包含:[2,5,8]
分区 3 包含:[3,6,9]
?
还有多少消费者可以获得所有数据 3?为什么?
你能解释一下吗?
我也猜消费者群体可以解决它,但不知道为什么
【问题讨论】:
标签:
apache-kafka
kafka-consumer-api
【解决方案1】:
你能解释一下 kafka 分区是如何在这种情况下工作的吗
你的理解是正确的。
还有多少消费者可以获得所有数据 3?为什么?
取决于您的消费者组中有多少消费者。
如果一个组中只有一个消费者,它将从所有分区中获取所有消息。
如果您在一个组中有 2 个消费者,每个消费者都将声明分区的一个子集,例如第一个消费者将从分区 1 和 2 获取所有消息,第二个消费者将从分区 3 获取消息。
如果您在一个组中有 3 个使用者,每个使用者将分配一个分区。
如果一个组中有超过 3 个消费者,则 3 个消费者将分别获得一个分区,其余消费者将不会收到任何消息,只是在故障转移时充当冗余。
【解决方案2】:
当且仅当您发布没有密钥的消息时,分区中的消息分布才是正确的。在 Kafka 中,通常将消息作为 (Key, Value) 对发布,如果您以这种方式生成消息,则默认分区器将确保相同键的所有消息都放在同一个分区中。它通过在映射到可用分区之一的每个键上使用散列函数来做到这一点。在所有消息都具有相同密钥的极端情况下,它们都将进入同一个分区。如果您的消息都有一个字符串键“foo”或一个名为“bar”的键,那么所有键为“foo”的消息可能会进入分区 3,所有键为“bar”的消息可能会进入分区 1。
就您关于消费者的问题而言,您可以拥有无限数量的消费者。如果每个消费者都有一个唯一的 group.id,那么他们被认为是独立的,他们每个人都会从所有分区中获得自己的完整消息集。
但是,如果您有共享相同 group.id 的消费者,则称他们在一个消费者组中,并且每个消费者都将获得一个排他且大致相等的分区子集。如果您在同一组中有 3 个消费者,他们将分别获得 1 个分区。如果您在同一个组中添加了超过 3 个消费者,那么前 3 个消费者将分别获得 1 个分区,所有其他消费者将成为备用消费者,而不是只有在 3 个活动消费者中的一个离开该组时才会成为活动消费者。
【解决方案3】:
消息通过分区的分布在想法上是正确的。分区是Kafka的并行单元。
您可以有 3 个消费者,每个消费者处理一个分区,但您也可以只有 1 个消费者从 3 个分区获取数据。这取决于每个消费者可以拥有/想要的吞吐量。
关于消费群体:
- 如果您的所有消费者具有相同的消费者组,则消息将在消费者之间进行负载平衡
- 如果你的消费者有不同的消费者组,那么每条消息都会广播到所有消费者进程
仅供参考:消息的顺序只保存在一个分区内,这就是为什么来自不同分区的消息可能是无序的。