理解Kafka主题和分区

我开始学习卡夫卡,在阅读过程中,我想到了一些问题:

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

  2. 当一个订阅者正在运行时,它是否指定了它的组id,以便它可以成为同一主题的消费者集群的一部分,还是该组消费者感兴趣的几个主题的一部分?

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

  4. 分区是否由代理创建,因此与消费者无关?

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

  6. 当消息从队列中删除时会发生什么?-例如,保留了3个小时,然后时间过去了,双方的抵消是如何处理的?

136564 次浏览

让我们按顺序排列:)

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

默认情况下,生成器不关心分区。您可以选择使用定制的分区器来更好地控制,但这完全是可选的。


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

是的,消费者加入(或者单独创建)一个消费者组来分担负载。同一组中的任何两个消费者都不会收到相同的消息。


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

既不。在两种情况下,为一个消费者组中的所有消费者分配了一组分区:同一组中没有两个消费者有任何公共分区,并且为整个消费者组分配了每个现有分区。


4 -分区是由代理创建的,因此与消费者无关吗?

它们不是,但是从3中可以看出,拥有比现有分区更多的消费者是完全没有用的,所以这是用于消费的最大并行度级别。


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

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


6 -当消息从队列中删除时会发生什么?-例如:保留了3个小时,然后时间过去了,双方的抵消是如何处理的?

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

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

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

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

分区中的消息有一个连续的id编号,该编号唯一地标识分区中的每个消息。

分区允许主题的日志扩展到超出单个服务器(代理)的大小,并充当并行单位。

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

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

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

这篇文章已经有了答案,但我添加了一些卡夫卡权威指南的图片

在回答问题之前,让我们先来看看生产者组件的概述:

生产者组件概述

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

生产者将根据以下条件决定放置任何消息的目标分区:

  • 分区id(如果在消息中指定)
  • 键% num个分区,如果没有提到分区id
  • 如果消息中既没有分区id也没有消息键,则表示只有该值可用

2. 当订阅服务器正在运行时——它是否指定了它的组id,以便它可以成为同一主题的消费者集群的一部分,还是该组消费者感兴趣的几个主题的消费者集群的一部分?

你应该总是配置group.id,除非你使用简单的赋值API,你不需要在Kafka中存储偏移量。它不会成为任何组织的一部分。

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

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

  • 消费者数量为不到主题分区数量,则可以将多个分区分配给组中的一个消费者 number of consumers less than topic partitions
  • .
  • 消费者数量相同作为主题分区的数量,那么分区和消费者映射可以如下所示, number of consumers as number of topic partitions
  • 消费者的数量是高于主题分区的数量,那么分区和消费者的映射可以如下所示,无效,检查消费者5 number of consumers more than number of topic partitions
  • .

4. 由于分区是由代理创建的,因此不需要考虑使用者吗?

消费者应注意的分区数,如在问题3中讨论的。

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

Kafka(具体来说是组织协调)通过向内部< >强__consumer_offsets < / >强主题生成消息来处理偏移量状态,此行为也可以通过将enable.auto.commit设置为false来配置为手动。在这种情况下,consumer.commitSync()consumer.commitAsync()可以帮助管理偏移量。

关于组织协调的更多信息:

  1. 它是Kafka服务器端集群中选出的代理之一。
  2. 消费者与组协调器交互以提交偏移和获取请求。
  3. 使用者定期向组协调器发送心跳。

6. 从队列中删除消息时会发生什么?-例如,保留了3个小时,然后时间过去了,双方的抵消是如何处理的?

如果任何消费者在保留期之后启动,消息将根据auto.offset.reset配置被消费,该配置可以是latest/earliest。技术上它是latest(开始处理新消息),因为所有的消息都在那个时候过期了,而保留是主题级配置。

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

是的,Producer确实指定了主题

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

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


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

当Kafka消费者被构造和组。Id还不存在(即该组中没有现有的消费者),则自动创建消费者组。

.如果一个组中的所有消费者都离开了该组,该组将自动销毁
  1. 每个消费者组在代理上都有相应的分区吗?还是每个消费者都有一个分区?

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


  1. 分区是由代理创建的,因此与使用者无关吗?

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

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

在给消费者分配分区之前,Kafka会首先检查是否有任何具有给定group-id的现有消费者。 当没有具有给定group-id的现有消费者时,它会将该主题的所有分区分配给这个新消费者。 当已经有两个消费者使用给定的group-id,而第三个消费者希望使用相同的group-id进行消费时。它将在所有三个使用者之间平均分配分区。同一个group-id的两个消费者不会被分配到同一个分区 < / p >
  1. 由于这是一个每个分区都有偏移量的队列,那么消费者是否有责任指定希望读取哪些消息?是否需要保存其状态?

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


  1. 从队列中删除消息时会发生什么?-例如,保留了3个小时,然后时间过去了,双方的抵消是如何处理的?

它会根据需要自动重新配置自己。它应该给出一个错误。