- 当生产者生成消息时,它会指定要将消息发送到的主题,对吗?它关心分区吗?
是的,生产者确实指定了主题
producer.send(new ProducerRecord<byte[],byte[]>(topic, partition, key1, value1) , callback);
Kafka 集群中的分区越多,可以实现的吞吐量就越高。选择分区数量的粗略公式基于吞吐量。您可以测量在单个分区上可以实现的生产(称为 p)和消费(称为 c)的吞吐量。
- 当订阅者正在运行时 - 它是否指定了其组 ID,以便它可以成为同一主题的消费者集群的一部分,或者该消费者组感兴趣的多个主题的一部分?
当 Kafka 消费者被构建并且 group.id 还不存在时(即不存在属于该组的消费者),将自动创建消费者组。
如果一个组中的所有消费者都离开了该组,则该组将自动销毁。
- 是每个消费者组在代理上都有对应的分区,还是每个消费者都有一个?
每个消费者组分配一个分区,多个消费者组可以访问一个分区,但不能将属于一个消费者组的两个消费者分配到同一个分区,因为消费者在一个组中顺序消费消息,如果一个组中有多个消费者从同一个分区消费消息,那么序列可能会丢失,而逻辑上独立的组可以从同一个分区消费。
- 分区是由代理创建的,因此消费者不必担心吗?
经纪人已经有分区。
每个代理最多有 4,000 个分区,每个集群最多有 200,000 个分区。
每当消费者进入或离开消费者组时,代理都会重新平衡消费者之间的分区,这意味着 Kafka 会根据每个应用程序实例的分区数量为您处理负载平衡。
在将分区分配给消费者之前,Kafka 将首先检查是否有任何具有给定 group-id 的现有消费者。
当没有具有给定 group-id 的现有消费者时,它将将该主题的所有分区分配给这个新消费者。
当已经有两个消费者具有给定的 group-id 并且第三个消费者想要使用相同的 group-id 消费时。它将在所有三个消费者之间平均分配分区。不会将同一 group-id 的两个消费者分配到同一分区
source
- 既然这是一个队列,每个分区都有一个偏移量,那么消费者是否有责任指定它想要读取哪些消息?它需要保存它的状态吗?
偏移量由 Kafka 内部处理。当前偏移量是指向 Kafka 在最近轮询中已经发送给消费者的最后一条记录的指针。因此,由于当前偏移量,消费者不会两次获得相同的记录。
不需要专门指定
- 从队列中删除消息后会发生什么? - 比如保留3小时,然后时间过去了,两边的offset是怎么处理的?
它会根据需要自动重新配置自己。它应该给出一个错误。