当前位置: 首页 > 知识库问答 >
问题:

Kafka主题与分区

纪枫
2023-03-14

简单问题:

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

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

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

我的问题是:

当制作人生成这些消息时:

1)每个消息将只在且仅在1个分区?也就是说,1在P1,2在P2,3在P3,然后4在P1,5在P2,6在P3,以此类推?

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

谢谢

共有3个答案

经嘉
2023-03-14

每个消息将只发送到一个分区

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

左康安
2023-03-14

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

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

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

司英彦
2023-03-14

>

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

比方说,一个Kafka主题有3个分区,你有3个消费者有相同的group.id.每个消费者将从1-1个分区读取。但是如果只有一个消费者,它将从所有3个分区读取。

 类似资料:
  • 通过Kafka文档和各种其他资源,我了解到Kafka中的消息被组织成主题。此外,主题可以分解为多个分区,每个分区可以托管在不同的服务器上。这提供了冗余和可伸缩性。 我不确定这里的“破碎”这个词是什么意思。这是否意味着,如果添加到主题的消息是,例如“1 2 3 4 5 6 7”,那么在将其分解为分区后,我们将有一个分区仅包含整个主题的子部分。就像一个分区有“1 2 3”,而另一个分区有“4 5 6”

  • Kafka主题分区偏移位置始终从0或随机值开始,如何确保使用者记录是分区中的第一条记录?有没有办法找出答案?如果有的话,请让我知道。谢谢。

  • 我有一个问题,假设有一个TOPIC T1,有两个消费者C1和C2属于两个不同的组,电流偏移量是0.我们知道Kafka维护消费者的偏移量。因此,如果 C1 使用消息并且 Offset 变为 1,那么如果 C2 使用消息,它将从 1 偏移量开始,还是从 0 偏移量开始使用消息,会发生什么情况?表示两个不同的消费群体将如何维持抵消? 谢啦

  • 我在《掌握Kafka Streams and ksqlDB》一书中遇到了以下两个短语,作者使用了两个术语,它们的真正含义是“压缩主题”和“未压缩主题” 他们对“日志压缩”有什么看法吗? 表可以被认为是对数据库的更新。在日志的这种视图中,只保留每个键的当前状态(给定键的最新记录或某种聚合)。表通常是从压缩的主题构建的。 用数据库的说法,流可以被视为插入。每个不同的记录都保留在此日志视图中。流通常是从

  • 我们希望在Kafka streams应用程序中使用GlobalKTable。输入主题(ktable/kstream)有N个分区,并且GlobalKTable将用作流应用程序中的字典。 GlobalKTable的输入主题必须与其他输入主题(它们是KTable/KStream的源)具有相同数量的分区吗? 据我所知,答案是否定的(它不受限制,主题也可能有M个分区,其中N>M),因为GlobalKTabl

  • 我开始学习Kafka用于企业解决方案。 在我阅读的过程中,我脑海中浮现出一些问题: > 当一个生产者正在生成一个消息--它会指定它想要将消息发送到的主题,是这样吗?它关心分区吗? 当订阅服务器运行时-它是否指定其组id,以便它可以是同一主题的使用者集群的一部分,或者是该组使用者感兴趣的几个主题的一部分? 每个消费者组在代理上有一个对应的分区还是每个消费者都有一个? 分区是由代理创建的,因此不是消费