繁体   English   中英

卡夫卡主题与分区

[英]Kafka topic with Partitions

简单的问题:

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

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

1,2,3,.......... 20

我的问题是:

生产者产生以下消息时:

1)每个消息都只能在一个分区中吗? 也就是说,P1中为1,P2中为2,P3中为3,然后P1中为4,P2中为5,P3中为6,依此类推?

2)如果#1为true,那么当使用者订阅时,它将订阅所有分区,以便获取所有消息?

谢谢

  1. 是的,每条消息仅写入一个分区中。

  2. 当单个使用者订阅kafka主题(具有多个分区)时,它将从所有分区读取消息。 但是,如果您使用同一个使用者group.id运行多个使用者,则每个使用者将从不同的分区中读取。

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

1)目标分区由生产者确定。 使用默认的分区程序算法(可以自定义),目标分区是:hash(message-key)%num_partitions。 这意味着所有具有相同密钥的消息都将进入同一分区。 因此,如果您使用密钥,并且所有消息都具有相同的密钥,那么它们将进入相同的分区。 如果未指定密钥,则使用轮询。 无论如何,一条消息总是仅到达一个分区。

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

让不同的消费者从不同的分区获取消息是Kafka如何真正扩展的方式。 这不是缺点,因为您必须考虑使用应用程序(由多个使用者组成)的情况。 应用程序标识符可以是其所有使用者使用的组ID:您让应用程序从该主题获取所有消息,但负载分散在其使用者上。

每条消息将仅发送到一个分区

如果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),一个分区只能由同一组的一个使用者使用,并且不同组的使用者可以绑定同一分区以重复使用。 但是,消费者可以使用多个分区。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM