我开始学习卡夫卡,在阅读过程中,我想到了一些问题:
当生产者产生消息时——它会指定它想要将消息发送到的主题,对吗?它关心分区吗?
当一个订阅者正在运行时,它是否指定了它的组id,以便它可以成为同一主题的消费者集群的一部分,还是该组消费者感兴趣的几个主题的一部分?
每个消费者组在代理上都有一个对应的分区吗?还是每个消费者都有一个?
分区是否由代理创建,因此与消费者无关?
当消息从队列中删除时会发生什么?-例如,保留了3个小时,然后时间过去了,双方的抵消是如何处理的?
让我们按顺序排列:)
1 -当生产者生产消息时-它会指定它想要将消息发送到的主题,对吗?它关心分区吗?
默认情况下,生成器不关心分区。您可以选择使用定制的分区器来更好地控制,但这完全是可选的。
2 -当一个订阅者正在运行时,它是否指定了它的组id,以便它可以成为同一主题的消费者集群的一部分,还是该组消费者感兴趣的几个主题的一部分?
是的,消费者加入(或者单独创建)一个消费者组来分担负载。同一组中的任何两个消费者都不会收到相同的消息。
3 -每个消费者组在代理上都有相应的分区吗?还是每个消费者都有一个分区?
既不。在两种情况下,为一个消费者组中的所有消费者分配了一组分区:同一组中没有两个消费者有任何公共分区,并且为整个消费者组分配了每个现有分区。
4 -分区是由代理创建的,因此与消费者无关吗?
它们不是,但是从3中可以看出,拥有比现有分区更多的消费者是完全没有用的,所以这是用于消费的最大并行度级别。
5 -既然这是一个每个分区都有偏移量的队列,那么消费者是否有责任指定它想要读取哪些消息?是否需要保存其状态?
是的,消费者为每个分区的每个主题保存一个偏移量。这完全是卡夫卡处理的,不用担心。
6 -当消息从队列中删除时会发生什么?-例如:保留了3个小时,然后时间过去了,双方的抵消是如何处理的?
如果使用者请求代理上某个分区不可用的偏移量(例如,由于删除),它将进入错误模式,并最终为该分区将自己重置为可用的最新消息或旧消息(取决于auto.offset.reset配置值),并继续工作。
Kafka使用了主题的概念来为消息流带来秩序。
为了平衡负载,可以将主题划分为多个分区,并跨代理进行复制。
分区是有序的,不可变的消息序列,不断追加,即提交日志。
分区中的消息有一个连续的id编号,该编号唯一地标识分区中的每个消息。
分区允许主题的日志扩展到超出单个服务器(代理)的大小,并充当并行单位。
主题的分区分布在Kafka集群中的代理上,每个代理处理数据和共享分区的请求。
每个分区都在可配置数量的代理之间复制,以确保容错。
在本文中详细解释:http://codeflex.co/what-is-apache-kafka/
这篇文章已经有了答案,但我添加了一些卡夫卡权威指南的图片 在回答问题之前,让我们先来看看生产者组件的概述:
在回答问题之前,让我们先来看看生产者组件的概述:
1. 当生产者产生消息时——它会指定想要将消息发送到的主题,对吗?它关心分区吗?
生产者将根据以下条件决定放置任何消息的目标分区:
2. 当订阅服务器正在运行时——它是否指定了它的组id,以便它可以成为同一主题的消费者集群的一部分,还是该组消费者感兴趣的几个主题的消费者集群的一部分?
你应该总是配置group.id,除非你使用简单的赋值API,你不需要在Kafka中存储偏移量。它不会成为任何组织的一部分。源
3.每个消费者组在代理上都有相应的分区吗?还是每个消费者都有一个分区?
在一个消费者组中,每个分区只由一个消费者处理。这些都是可能的情况
4. 由于分区是由代理创建的,因此不需要考虑使用者吗?
消费者应注意的分区数,如在问题3中讨论的。
5. 由于这是一个每个分区都有偏移量的队列,那么消费者是否有责任指定希望读取哪些消息?是否需要保存其状态?
Kafka(具体来说是组织协调)通过向内部< >强__consumer_offsets < / >强主题生成消息来处理偏移量状态,此行为也可以通过将enable.auto.commit设置为false来配置为手动。在这种情况下,consumer.commitSync()和consumer.commitAsync()可以帮助管理偏移量。
enable.auto.commit
false
consumer.commitSync()
consumer.commitAsync()
关于组织协调的更多信息:
6. 从队列中删除消息时会发生什么?-例如,保留了3个小时,然后时间过去了,双方的抵消是如何处理的?
如果任何消费者在保留期之后启动,消息将根据auto.offset.reset配置被消费,该配置可以是latest/earliest。技术上它是latest(开始处理新消息),因为所有的消息都在那个时候过期了,而保留是主题级配置。
auto.offset.reset
latest/earliest
latest
是的,Producer确实指定了主题
producer.send(new ProducerRecord<byte[],byte[]>(topic, partition, key1, value1) , callback);
Kafka集群中的分区越多,其吞吐量就越高。选择分区数量的粗略公式是基于吞吐量的。您可以测量在单个分区上为生产(称为p)和消费(称为c)所能实现的性能。
当Kafka消费者被构造和组。Id还不存在(即该组中没有现有的消费者),则自动创建消费者组。
每个消费者组被分配一个分区,多个消费者组可以访问一个分区,但属于一个消费者组的2个消费者不会被分配到同一个分区,因为消费者在一个组中按顺序消费消息,如果来自一个组的多个消费者从同一个分区消费消息,那么顺序可能会丢失,而逻辑上独立的组可以从同一个分区消费。
代理已经有分区。 每个代理最多有4,000个分区,每个集群最多有200,000个分区
无论何时消费者进入或离开消费者组,代理都会在消费者之间重新平衡分区,这意味着Kafka会根据每个应用程序实例的分区数量来处理负载平衡。
Offset由Kafka内部处理。当前偏移量是一个指针,指向Kafka在最近的民意调查中已经发送给消费者的最后一个记录。因此,由于当前偏移,消费者不会得到相同的记录两次。 它不需要专门指定
它会根据需要自动重新配置自己。它应该给出一个错误。