Apache kafka 卡夫卡分区的行为

Apache kafka 卡夫卡分区的行为,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,你能解释一下kafka分区在这个场景中是如何工作的吗 如果我用1个主题和3个分区生成9(1-9)条消息循环 这是否意味着: 分区1包含:[1,4,7] 分区2包含:[2,5,8] 分区3包含:[3,6,9] ? 还有多少消费者可以获得所有数据3?为什么? 你能解释一下吗 我想消费者小组也可以解决这个问题,但不确定为什么通过分区分发消息的想法是正确的。分区是卡夫卡的平行单位 您可以有3个使用者,每个使用者将处理一个分区,但您也可以只有1个使用者将从3个分区获取数据。这取决于每个消费者的吞吐量 关于

你能解释一下kafka分区在这个场景中是如何工作的吗

如果我用1个主题和3个分区生成9(1-9)条消息循环

这是否意味着:

分区1包含:[1,4,7]

分区2包含:[2,5,8]

分区3包含:[3,6,9]

?

还有多少消费者可以获得所有数据3?为什么?

你能解释一下吗


我想消费者小组也可以解决这个问题,但不确定为什么通过分区分发消息的想法是正确的。分区是卡夫卡的平行单位

您可以有3个使用者,每个使用者将处理一个分区,但您也可以只有1个使用者将从3个分区获取数据。这取决于每个消费者的吞吐量

关于消费者群体:

  • 如果您的所有消费者都具有相同的消费者组,则消息将在消费者上进行负载平衡
  • 如果您的使用者具有不同的使用者组,则每个消息都将广播到所有使用者进程
仅供参考:消息顺序只保留在一个分区内,这就是为什么来自不同分区的消息可能是无序的

你能解释一下kafka分区在这个场景中是如何工作的吗

你的理解是正确的

还有多少消费者可以获得所有数据3?为什么?

取决于您的消费者群体中有多少消费者

如果一个组中只有一个使用者,它将从所有分区获取所有消息

如果您在一个组中有两个使用者,每个使用者都将声明分区的一个子集,例如,第一个使用者将从分区1和2获取所有消息,第二个使用者将从分区3获取消息

如果一个组中有3个使用者,则每个使用者将分配一个分区


如果一个组中有3个以上的使用者,则3个使用者将分别获得一个分区,其余的使用者将不会获得任何消息,只是在故障切换时充当冗余。

仅当您发布没有密钥的消息时,分区中的消息分布才是正确的。在Kafka中,通常将消息发布为(键、值)对,如果以这种方式生成消息,则默认分区器将确保具有相同键的所有消息都放在同一分区中。它通过对映射到一个可用分区的每个键使用哈希函数来实现这一点。在极端情况下,如果所有消息都具有相同的密钥,那么它们都将进入相同的分区。如果您的所有消息都有一个字符串键“foo”或一个名为“bar”的键,那么所有带有键“foo”的消息都可以转到分区3,而带有键“bar”的所有消息都可以转到分区1

就你关于消费者的问题而言,你可以拥有无限数量的消费者。若每个使用者都有一个唯一的group.id,那个么它们被认为是独立的,它们将从所有分区获得自己的完整消息集

但是,如果您有共享同一group.id的使用者,则它们被称为在使用者组中,并且每个使用者将获得一个独占的、大致相等的分区子集。如果在同一个组中有3个使用者,则每个使用者将获得1个分区。如果在同一组中添加了超过3个使用者,则前3个使用者将分别获得1个分区,所有其他使用者将成为备用使用者,而不是仅当3个活动使用者中的一个离开组时才变为活动