我正在寻找关于这个问题的一些澄清。 在Kafka文档中,我发现了以下内容:
Kafka仅提供分区内消息的总排序,而不是主题中不同分区之间的消息。对于大多数应用程序而言,按分区排序与按键分区数据的能力相结合就足够了。但是,如果您需要对邮件进行总订单,则可以使用仅包含一个分区的主题来实现,但这意味着每个使用者组只有一个使用者进程。
所以这是我的问题:
这是否意味着如果我希望有一个以上的消费者(来自同一组)从一个主题中读取我需要超过1个分区?
这是否意味着我需要与同一组的消费者数量相同的分区数量?
有多少消费者可以从一个分区读取?
关于API的关键和分区之间的关系也有一些问题。我只看了.net API(特别是来自MS的API),但看起来像模仿Java API。 我看到当使用生产者向主题发送消息时,有一个关键参数。但是,当消费者从主题中读取时,存在分区号。
提前致谢。
答案 0 :(得分:16)
这是否意味着我想拥有超过1个消费者(来自同一个消费者) 从一个主题中读取我需要超过1个分区?
让我们看看kafka的以下属性:
通过这些属性,kafka能够在一组消费者流程中提供ordering guarantees
和load balancing
。
要回答您的问题,是的,在同一组的上下文中,如果您想拥有N consumers
,则必须拥有at least N topics
。
这是否意味着我需要与消费者数量相同的分区数量 对于同一组?
我认为这已在第一个答案中解释过了。
有多少消费者可以从一个分区读取?
可以从一个分区读取的number of consumers
始终等于订阅该主题的number of consumer groups
。
关于API的密钥和分区之间的关系
首先,我们必须明白producer
负责选择分配给主题中哪个分区的记录。
现在,让我们看看制作人如何这样做。首先,让我们看一下ProducerRecord.java
的类定义:
public class ProducerRecord<K, V> {
private final String topic;
private final Integer partition;
private final Headers headers;
private final K key;
private final V value;
private final Long timestamp;
}
在这里,我们必须从班级中了解的字段是partition
。
来自文档,
partition number
,则在发送记录时将使用partition
。 key
,则将使用hash of the key
选择分区。 key
和partition
都不存在,则会在round-robin fashion
中分配分区。 答案 1 :(得分:12)
伊戈尔,
分区增加了Kafka主题的并行性。任何数量的消费者/生产者都可以使用相同的分区。它由应用程序层来定义协议。卡夫卡保证交货。关于API,您可能希望查看Java文档,因为它们可能更完整。根据我的经验: