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

When a producer is producing a message - it will specify the topic it wants to send the message to, is that right? Does it care about partitions? When a subscriber is running - does it specify its group id so that it can be part of a cluster of consumers of the same topic or several topics that this group of consumers is interested in? Does each consumer group have a corresponding partition on the broker or does each consumer have one? Are the partitions created by the broker, and therefore not a concern for the consumers? Since this is a queue with an offset for each partition, is it the responsibility of the consumer to specify which messages it wants to read? Does it need to save its state? What happens when a message is deleted from the queue? - For example, the retention was for 3 hours, then the time passes, how is the offset being handled on both sides?


当前回答

这篇文章已经有了答案,但我添加了一些卡夫卡权威指南的图片 在回答问题之前,让我们先来看看生产者组件的概述:

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

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

分区id(如果在消息中指定) 如果没有提到分区id,则输入% num个分区 如果消息中分区id和消息键都不可用,则轮询表示只有该值可用

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

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

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

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

消费者数量小于主题分区数量,则可以将多个分区分配给组中的一个消费者 消费者数量与主题分区数量相同,则分区与消费者映射如下所示: 消费者数量高于主题分区数量,则分区和消费者映射如下所示,无效,检查消费者5

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

消费者应该知道分区的数量,正如在问题3中讨论的那样。

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

Kafka(具体来说是组协调器)通过向内部__consumer_offset主题生成消息来处理偏移量状态,这个行为也可以通过设置enable.auto.commit为false来配置为manual。在这种情况下,consumer.commitSync()和consumer.commitAsync()可以帮助管理偏移量。

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

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

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

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

其他回答

这篇文章已经有了答案,但我添加了一些卡夫卡权威指南的图片 在回答问题之前,让我们先来看看生产者组件的概述:

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

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

分区id(如果在消息中指定) 如果没有提到分区id,则输入% num个分区 如果消息中分区id和消息键都不可用,则轮询表示只有该值可用

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

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

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

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

消费者数量小于主题分区数量,则可以将多个分区分配给组中的一个消费者 消费者数量与主题分区数量相同,则分区与消费者映射如下所示: 消费者数量高于主题分区数量,则分区和消费者映射如下所示,无效,检查消费者5

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

消费者应该知道分区的数量,正如在问题3中讨论的那样。

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

Kafka(具体来说是组协调器)通过向内部__consumer_offset主题生成消息来处理偏移量状态,这个行为也可以通过设置enable.auto.commit为false来配置为manual。在这种情况下,consumer.commitSync()和consumer.commitAsync()可以帮助管理偏移量。

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

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

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

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

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


是的,Producer确实指定了主题

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

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


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


当Kafka消费者被构造和分组时。Id还不存在(即该组中没有现有的消费者),则自动创建消费者组。 如果组中的所有消费者都离开该组,则该组将自动销毁。


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


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


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


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

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

Before assigning partitions to a consumer, Kafka would first check if there are any existing consumers with the given group-id. When there are no existing consumers with the given group-id, it would assign all the partitions of that topic to this new consumer. When there are two consumers already with the given group-id and a third consumer wants to consume with the same group-id. It would assign the partitions equally among all three consumers. No two consumers of the same group-id would be assigned to the same partition source


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


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


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


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

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

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

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

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

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

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

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

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

让我们按顺序排列:)

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

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


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

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


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

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


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

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


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

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


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

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