[英]Understanding Kafka Topics and Partitions
我开始学习Kafka,在阅读的过程中,我想到了一些问题:
当生产者生成消息时 - 它会指定要将消息发送到的主题,对吗? 它关心分区吗?
当订阅者正在运行时 - 它是否指定了它的组 ID,以便它可以成为同一主题的一组消费者或该组消费者感兴趣的几个主题的一部分?
每个消费者组在broker上都有对应的分区还是每个消费者都有一个?
分区是由代理创建的,因此消费者不关心吗?
由于这是一个队列,每个分区都有一个偏移量,消费者是否有责任指定它想要读取的消息? 它需要保存它的状态吗?
从队列中删除消息时会发生什么? - 比如保留了3个小时,那么时间过去了,两边的offset是怎么处理的?
这篇文章已经有了答案,但我正在用 Kafka Definitive Guide 中的几张图片添加我的观点
在回答问题之前,让我们先看一下生产者组件的概述:
1. 当生产者正在生产一条消息时 - 它会指定要将消息发送到的主题,对吗? 它关心分区吗?
生产者将决定目标分区来放置任何消息,具体取决于:
2. 当订阅者正在运行时 - 它是否指定了它的组 id,以便它可以成为同一主题的一组消费者的一部分,或者这组消费者感兴趣的几个主题?
您应该始终配置group.id ,除非您使用的是简单分配 API 并且您不需要在 Kafka 中存储偏移量。 它不会是任何组的一部分。 来源
3、每个消费者组在broker上有对应的分区还是每个消费者都有一个分区?
在一个消费者组中,每个分区仅由一个消费者处理。 这些是可能的场景
4. 由于是broker创建的分区,所以消费者不关心?
消费者应该知道分区的数量,如问题 3 中所讨论的。
5. 由于这是一个队列,每个分区都有一个偏移量,消费者是否有责任指定它想要读取的消息? 它需要保存它的状态吗?
Kafka(特定的Group Coordinator )通过向内部__consumer_offsets主题生成消息来处理偏移状态,此行为也可以通过将enable.auto.commit
设置为false
来配置为手动。 在这种情况下, consumer.commitSync()
和consumer.commitAsync()
有助于管理偏移量。
更多关于小组协调员:
6. 当消息从队列中删除时会发生什么? - 例如:保留了3个小时,然后时间过去了,双方如何处理offset?
如果任何消费者在保留期之后启动,消息将根据auto.offset.reset
配置(可能是latest/earliest
被消费。 从技术上讲,它是latest
(开始处理新消息),因为到那时所有消息都已过期,并且保留是主题级别的配置。
让我们按顺序来:)
1 - 当生产者生产消息时 - 它将指定要将消息发送到的主题,对吗? 它关心分区吗?
默认情况下,生产者不关心分区。 您可以选择使用自定义分区器来获得更好的控制,但这完全是可选的。
2 - 当订阅者正在运行时 - 它是否指定了它的组 ID,以便它可以成为该组消费者感兴趣的相同主题或多个主题的消费者集群的一部分?
是的,消费者加入(或创建,如果他们是单独的)消费者组来分担负载。 同一组中的两个消费者永远不会收到相同的消息。
3 - 每个消费者组在代理上是否都有相应的分区,还是每个消费者都有一个?
都没有。 在两种情况下,消费者组中的所有消费者都被分配了一组分区:同一组中的两个消费者没有任何共同的分区 - 消费者组作为一个整体被分配到每个现有分区。
4 - 是由代理创建的分区,因此消费者不关心吗?
它们不是,但是您可以从 3 中看到,拥有比现有分区更多的消费者是完全没有用的,因此这是您消费的最大并行度级别。
5 - 由于这是一个队列,每个分区都有一个偏移量,消费者是否有责任指定它想要读取的消息? 它需要保存它的状态吗?
是的,消费者为每个分区的每个主题保存一个偏移量。 这完全由Kafka处理,不用担心。
6 - 从队列中删除消息时会发生什么? - 例如:保留了3个小时,然后时间过去了,双方如何处理offset?
如果消费者曾经请求对代理上的分区不可用的偏移量(例如,由于删除),它将进入错误模式,并最终将此分区的自身重置为可用的最新消息或最旧消息(取决于auto.offset.reset 配置值),然后继续工作。
Kafka 使用Topic概念将顺序带入消息流。
为了平衡负载,一个主题可能被分成多个分区并跨代理复制。
分区是有序的、不可变的消息序列,它们不断附加,即提交日志。
分区中的消息具有唯一标识分区内每条消息的顺序 ID 号。
分区允许主题的日志扩展到超过适合单个服务器(代理)并充当并行单元的大小。
主题的分区分布在 Kafka 集群中的代理上,其中每个代理处理数据和对分区份额的请求。
每个分区都跨可配置数量的代理进行复制,以确保容错。
在这篇文章中有很好的解释: http : //codeflex.co/what-is-apache-kafka/
是的,生产者确实指定了主题
producer.send(new ProducerRecord<byte[],byte[]>(topic, partition, key1, value1) , callback);
Kafka 集群中的分区越多,可以实现的吞吐量就越高。 选择分区数量的粗略公式基于吞吐量。 您可以衡量在生产(称为 p)和消费(称为 c)的单个分区上可以实现的吞吐量。
当 Kafka 消费者被构建并且 group.id 还不存在(即没有属于该组的现有消费者)时,消费者组将被自动创建。 如果一个组中的所有消费者都离开了该组,则该组将自动销毁。
每个消费者组被分配一个分区,多个消费者组可以访问一个分区,但属于一个消费者组的 2 个消费者不会被分配到同一个分区,因为消费者在一个组中顺序消费消息,如果来自一个组的多个消费者从相同的分区然后序列可能会丢失,而逻辑上独立的组可以从同一个分区中消费。
经纪人已经有分区。 每个代理最多有 4,000 个分区,每个集群最多有 200,000 个分区。
每当消费者进入或离开消费者组时,代理都会重新平衡消费者之间的分区,这意味着 Kafka 会根据每个应用程序实例的分区数量为您处理负载平衡。
在将分区分配给消费者之前,Kafka 会首先检查是否存在具有给定组 ID 的任何现有消费者。 当没有具有给定 group-id 的现有消费者时,它将将该主题的所有分区分配给这个新消费者。 当已经有两个消费者使用给定的 group-id 并且第三个消费者想要使用相同的 group-id 进行消费时。 它将在所有三个消费者之间平均分配分区。 不会将具有相同 group-id 的两个消费者分配给同一个分区源
偏移量由 Kafka 内部处理。 当前偏移量是指向 Kafka 在最近轮询中已发送给消费者的最后一条记录的指针。 因此,由于当前的偏移量,消费者不会两次获得相同的记录。 不需要专门指定
它会根据需要自动重新配置自己。 它应该给出一个错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.