带分区的Kafka主题

nr9pn0ug  于 2021-06-06  发布在  Kafka
关注(0)|答案(3)|浏览(571)

简单问题:
假设我有一个有3个分区的主题:topic:stateevents p1、p2和p3。
我们还假设生产者生成20条消息:
1, 2, 3, ..........20
我的问题是:
当生产者生成这些消息时:
1) 每条消息是否只在一个分区中?也就是说,1在p1中,2在p2中,3在p3中,然后4在p1中,5在p2中,6在p3中,依此类推?
2) 如果#1为真,那么当使用者订阅时,它将订阅所有分区以便获得所有消息?
谢谢

46scxncf

46scxncf1#

1) 目标分区由生产者决定。使用默认的分区器算法(可以自定义),目标分区是:hash(message key)%num\u partitions。这意味着所有具有相同密钥的消息进入同一分区。因此,如果您使用的是一个密钥,并且所有消息都具有相同的密钥,那么它们将进入相同的分区。如果未指定密钥,则使用循环。在任何情况下,消息总是只发送到一个分区。
2) 如果使用者是使用者组中唯一的使用者,它将获得所有分区。您可以在同一使用者组中添加更多使用者以共享负载(在您的示例中,最多可以添加3个使用者,这是您在主题中拥有的分区数,因此一个使用者可以获得一个分区)。
让不同的消费者从不同的分区获得消息,这是kafka扩展得非常好的方式。这并不是一个缺点,因为您必须从消费应用程序(由多个消费者创建)的Angular 来考虑。应用程序标识符可以是其所有使用者使用的组id:应用程序从主题获取所有消息,但负载分布在其使用者上。

szqfcxe2

szqfcxe22#

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

quhf5bfb

quhf5bfb3#

是的,每条消息只写在一个分区中。
当单个使用者订阅kafka主题(具有多个分区)时,它将从所有分区读取消息。但是,如果使用相同的consumer group.id运行多个使用者,则每个使用者将从不同的分区读取数据。
假设,一个kafka主题有3个分区,您有3个具有相同group.id的使用者。每个使用者将读取1-1个分区。但是如果只有一个使用者,它将读取所有3个分区。

相关问题