kafka分区的行为方式

时间:2017-07-03 12:18:22

标签: apache-kafka kafka-consumer-api

您能解释一下kafka分区如何适用于这种情况

如果我生成9(1-9)条消息,循环播放1个主题& 3个分区。

这是否意味着:

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

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

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

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

你能解释一下吗?

我想消费者群体也可以解决它但不确定原因

3 个答案:

答案 0 :(得分:0)

通过分区的消息分发在这个想法中是正确的。分区是卡夫卡的派对单位。

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

关于消费者群体:

  • 如果您的所有消费者群体都拥有相同的消费者群体,则消息将通过消费者进行负载均衡
  • 如果您的消费者拥有不同的消费者群体,那么每条消息都将广播给所有消费者流程

FYI :消息顺序仅保留在分区内,这就是来自不同分区的消息可能无序的原因。

答案 1 :(得分:0)

  

您能解释一下kafka分区如何适用于这种情况

您的理解是正确的。

  

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

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

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

如果一个组中有2个消费者,则每个消费者都会声明一个分区的子集,例如第一个消费者将从分区1和2获取所有消息,第二个消费者将从分区3获取消息。

如果一个组中有3个消费者,则每个消费者将分配一个分区。

如果一个群组中有超过3个消费者,则3个消费者将分别获得一个分区,其余消费者将不会收到任何消息,只是在故障转移时充当冗余。

答案 2 :(得分:0)

当且仅当您发布没有密钥的邮件时,分区中的邮件分发才是正确的。在Kafka中,通常将消息发布为(Key,Value)对,如果以这种方式生成消息,则默认分区器将确保将相同键的所有消息放入同一分区。它通过在映射到其中一个可用分区的每个键上使用散列函数来实现此目的。在所有消息都具有相同密钥的极端情况下,它们都会转到同一个分区。如果你的消息都有一个字符串键" foo"或称为" bar"然后所有的消息都带有键" foo"可以使用键" bar"进入分区3和所有消息。可能会去分区1.

就您对消费者的问题而言,您可以拥有无​​限数量的消费者。如果每个消费者都有一个唯一的group.id,那么他们被认为是独立的,他们将从各个分区获得他们自己的全套消息。

但是,如果您的消费者共享同一个group.id,那么他们就会被认为是在一个消费者群体中,并且每个消费者群体都将得到一个独占且大致相等的分区子集。如果您在同一组中有3个消费者,则每个消费者将获得1个分区。如果您在同一组中添加了超过3个消费者,那么前3个将分别获得1个分区,而其他所有消费者将成为备用消费者,而不是仅在3个活跃消费者中的一个离开该组时才变为活动消息。