了解Kafka主题和分区

时间:2016-06-25 02:58:22

标签: apache-kafka kafka-consumer-api kafka-producer-api

我开始为企业解决方案目的学习Kafka。

在我的阅读中,我想到了一些问题:

  1. 当制作人正在制作消息时 - 它会指定要将消息发送到的主题,是吗?它关心分区吗?
  2. 当订阅者正在运行时 - 它是否指定了其组ID,以便它可以成为同一主题的消费者群集的一部分,或者该群体消费者感兴趣的几个主题?
  3. 每个消费者群体在代理上都有相应的分区,或者每个消费者都有一个分区?

  4. 代理是否创建了分区,因此不关心消费者?

  5. 由于这是一个每个分区都有一个偏移量的队列,因此消费者有责任指定它想要读取哪些消息吗?是否需要保存其状态?

  6. 从队列中删除邮件时会发生什么? - 例如:保留时间为3小时,然后时间过去了,两边的偏移量如何处理?

4 个答案:

答案 0 :(得分:95)

让我们按顺序排列:)

  

1 - 当制作人正在制作一条消息时 - 它会指定要将消息发送给的主题,是吗?它关心分区吗?

默认情况下,制作人并不关心分区。您可以选择使用自定义分区程序来获得更好的控制,但它完全是可选的。

  

2 - 当订阅者正在运行时 - 它是否指定了其组ID,以便它可以是同一主题的消费者群集的一部分,或者是该群体消费者感兴趣的几个主题?

是的,消费者加入(或创建,如果他们独自)一个消费者群体来共享负载。同一组中没有两个消费者会收到相同的消息。

  

3 - 每个消费者群体在代理上是否有相应的分区,或者每个消费者都有一个分区?

都不是。在两个条件下,消费者组中的所有消费者都被分配了一组分区:同一组中没有两个消费者具有共同的任何分区 - 并且每个现有分区都为消费者组分配了一个分区。

  

4 - 代理是否创建了分区,因此不关心消费者?

他们不是,但你可以从3看到,拥有比现有分区更多的消费者是完全没用的,所以它是你消费的最大并行度水平。

  

5 - 由于这是一个每个分区都有一个偏移量的队列,因此消费者有责任指定它想要读取哪些消息吗?是否需要保存其状态?

是的,消费者为每个分区保留每个主题的偏移量。这完全由卡夫卡处理,不用担心。

  

6 - 从队列中删除邮件时会发生什么? - 例如:保留时间为3小时,然后时间过去了,两侧的偏移量如何处理?

如果消费者曾要求代理上的分区不可用的偏移量(例如,由于删除),则它会进入错误模式,并最终将此分区的自身重置为可用的最新或最旧消息(取决于auto.offset.reset配置值),并继续工作。

答案 1 :(得分:56)

  

这篇文章已经有答案了,但是我要添加一些观点,这些观点来自《卡夫卡权威指南》

     

在回答每个问题之前,让我们先概述一下生产者组件:

overview of producer components

  

1。当生产者正在生成消息时,它将指定要将消息发送到的主题,对吗?它在乎分区吗?

生产者将决定目标分区以放置任何消息,具体取决于:

  • 分区ID(如果在消息中指定的话)
  • 键%num个分区,如果未提及分区ID
  • 如果消息中没有分区ID 消息键都不可用,则表示轮询,这意味着只有值可用
  

2。订户运行时-是否指定其组ID,以便它可以成为同一主题或该组消费者感兴趣的多个主题的消费者集群的一部分?

除非您使用的是简单分配API,并且无需在Kafka中存储偏移,否则应始终配置 group.id 。它不会成为任何组的一部分。 source

  

3。每个消费者组在代理上都有对应的分区吗?还是每个消费者都有一个分区?

在一个消费者组中,每个分区只能由一个消费者处理。这些是可能的情况

  • 使用者数量小于主题分区数量,则可以将多个分区分配给组中的一个使用者 number of consumers less than topic partitions
  • 使用者数量与主题分区的数量相同,然后分区和使用者映射如下所示, number of consumers same as number of topic partitions
  • 使用者数量比主题分区数量,则分区和消费者映射如下所示,无效,请检查消费者5 number of consumers more than number of topic partitions
  

4。作为经纪人创建的分区,因此消费者不必担心吗?

消费者应了解分区的数量,如问题3所述。

  

5。由于这是每个分区都有偏移量的队列,使用者是否有责任指定要读取的消息?是否需要保存其状态?

Kafka(具体来说是 Group Coordinator )会通过向内部 __ consumer_offsets 主题生成一条消息来处理偏移状态。通过将enable.auto.commit设置为false,也可以将其配置为手动。在这种情况下,consumer.commitSync()consumer.commitAsync()有助于管理偏移量。

有关组协调器的更多信息:

  1. 它是Kafka服务器端集群中当选的经纪人之一。
  2. 消费者与组协调器进行交互以获取偏移量提交和获取请求。
  3. 消费者定期向组协调器发送心跳。
  

6。从队列中删除消息会发生什么? -例如:保留时间为3小时,然后时间过去了,双方如何处理偏移量?

如果任何使用者在保留期后开始使用,则消息将按照auto.offset.reset的配置进行消耗,该配置可能是latest/earliest。从技术上讲,它是latest(开始处理新消息),因为到那时所有消息都已过期,并且 retention 是主题级别的配置。

答案 2 :(得分:10)

Kafka使用主题概念来为消息流带来秩序。

为了平衡负载,可以将主题划分为多个分区并在代理之间进行复制。

分区是有序的,不可变的消息序列,它们会不断附加,即提交日志。

分区中的消息具有唯一标识分区中每条消息的顺序ID号。

分区允许主题日志扩展超出适合单个服务器(代理)的大小,并作为并行单元。

主题的分区分布在Kafka集群中的代理上,每个代理处理数据并请求分区的共享。

每个分区都在可配置数量的代理中进行复制,以确保容错。

本文详细解释:http://codeflex.co/what-is-apache-kafka/

答案 3 :(得分:0)

  1. 当生产者生成消息时 - 它会指定要将消息发送到的主题,对吗?它关心分区吗?

是的,Producer 确实指定了主题

producer.send(new ProducerRecord<byte[],byte[]>(topic,  partition, key1, value1) , callback);

Kafka 集群中的分区越多,可以实现的吞吐量就越高。选择分区数量的粗略公式基于吞吐量。您可以衡量在生产(称为 p)和消费(称为 c)的单个分区上可以实现的吞吐量。


  1. 当订阅者正在运行时 - 它是否指定了它的组 ID,以便它可以成为同一主题或该组消费者感兴趣的多个主题的一组消费者的一部分?

当Kafka消费者被构建并且group.id还不存在时(即没有现有消费者属于该组),消费者组将被自动创建。 如果一个组中的所有消费者都离开了该组,则该组将自动销毁。


  1. 每个消费者组在代理上是否都有相应的分区,还是每个消费者都有一个分区?

每个consumer group被分配一个partition,多个consumer group可以访问一个partition,但是一个consumer group中的2个consumer不会被分配到同一个partition,因为consumer在一个group中顺序消费消息,如果多个consumer来自一个group消费来自同一分区的消息,那么序列可能会丢失,而逻辑上独立的组可以从同一分区消费。


  1. 分区是否由代理创建,因此消费者不关心?

经纪人已经有分区。 每个代理最多有 4,000 个分区,每个集群最多有 200,000 个分区。

每当消费者进入或离开消费者组时,代理都会重新平衡消费者之间的分区,这意味着 Kafka 会根据每个应用程序实例的分区数量为您处理负载平衡。

在将分区分配给消费者之前,Kafka 会首先检查是否存在具有给定组 ID 的任何现有消费者。 当没有具有给定 group-id 的现有消费者时,它将将该主题的所有分区分配给这个新消费者。 当已经有两个消费者使用给定的 group-id 并且第三个消费者想要使用相同的 group-id 进行消费时。它将在所有三个消费者之间平均分配分区。不会将具有相同 group-id 的两个消费者分配给同一个分区 source


  1. 由于这是一个队列,每个分区都有一个偏移量,消费者是否有责任指定它想要读取的消息?是否需要保存其状态?

Offset 由 Kafka 内部处理。当前偏移量是指向 Kafka 在最近轮询中已发送给消费者的最后一条记录的指针。因此,由于当前的偏移量,消费者不会两次获得相同的记录。 不需要专门指定


  1. 从队列中删除消息时会发生什么? - 比如保留了3个小时,那么时间过去了,两边的offset是怎么处理的?

它会根据需要自动重新配置自己。应该会报错。