apache-kafka - KafKa 分区器类,使用键将消息分配给主题内的分区

标签 apache-kafka

我是卡夫卡的新手,如果我听起来很愚蠢,我很抱歉,但到目前为止我所理解的
是.. 一个消息流可以定义为一个主题,就像一个类别。并且每个主题都被划分
到一个或多个分区(每个分区可以有多个副本)。所以他们并行行动

来自卡夫卡main site他们说

The producer is able to chose which message to assign to which partition within the topic. This can be done in a round-robin fashion simply to balance load or it can be done according to some semantic partition function (say based on some key in the message).



这是否意味着在消费时我将能够从特定分区中选择消息偏移量?
在运行多个分区时,是否可以从一个特定分区(即分区 0)中进行选择?

在 Kafka 0.7 quick start他们说

Send a message with a partition key. Messages with the same key are sent to the same partition.



并且可以在创建生产者时提供 key ,如下所示
    ProducerData<String, String> data = new ProducerData<String, String>("test-topic", "test-key", "test-message");
    producer.send(data);

现在我如何根据这个键消费消息?在 Kafka 中生产时使用此 key 的实际影响是什么?

在 0.8beta 中创建生产者时,我们可以通过配置文件提供分区器类属性。
可以创建自定义分区器类来实现 kafka 分区器接口(interface)。
但我有点困惑它究竟是如何工作的。 0.8 doc也没有过多解释。有什么建议还是我错过了什么?

最佳答案

Kafka 中的每个主题都分为许多分区。分区允许并行消耗增加吞吐量。

生产者使用 Kafka 生产者客户端库将消息发布到主题,该库使用分区器在可用分区之间平衡消息。生产者连接到的代理负责使用 zookeeper 中的分区所有者信息将消息发送到该分区的领导者代理。消费者使用 Kafka 的高级消费者库(它处理代理领导者的更改、管理 Zookeeper 中的偏移信息以及隐式地找出分区所有者信息等)来消费来自流中分区的消息;每个流可以映射到几个分区,具体取决于消费者选择如何创建消息流。

例如,如果一个主题有 10 个分区和 3 个消费者实例(C1、C2、C3 按此顺序启动)都属于同一个消费者组,我们可以有不同的消费模型允许读取并行,如下所示

每个消费者使用一个流。
在这个模型中,当 C1 启动时,主题的所有 10 个分区都映射到同一个流,并且 C1 开始从该流中消费。当 C2 启动时,Kafka 重新平衡两个流之间的分区。因此,每个流将被分配到 5 个分区(取决于重新平衡算法,它也可能是 4 对 6)并且每个消费者从其流中消费。同样,当 C3 启动时,分区在 3 个流之间再次重新平衡。请注意,在此模型中,当从分配给多个分区的流中消费时,消息的顺序将在分区之间困惑。

每个消费者使用多个流(例如 C1 使用 3,C2 使用 3,C3 使用 4)。
在这个模型中,当 C1 启动时,所有 10 个分区都分配给 3 个流,C1 可以使用多个线程同时从 3 个流中消费。当 C2 启动时,分区在 6 个流之间重新平衡,类似地,当 C3 启动时,分区在 10 个流之间重新平衡。每个消费者可以同时从多个流中消费。请注意,这里的流和分区的数量是相等的。如果流的数量超过分区,一些流将不会收到任何消息,因为它们不会被分配任何分区。

关于apache-kafka - KafKa 分区器类,使用键将消息分配给主题内的分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18202986/

相关文章:

python - ReadFromKafka 抛出 ValueError : Unsupported signal: 2

java - 'exactly once' 是否仅适用于流(主题 1 -> 应用程序 -> 主题 2)?

python - 将 CSV 从 Kafka 发送到 Spark Streaming

python - 如何使用 Python 以编程方式在 Apache Kafka 中创建主题

python - PySpark 2.x : Programmatically adding Maven JAR Coordinates to Spark

python - Kafka producer.send 从不发送消息

java - Kafka批处理配置不一致

apache-kafka - 什么会导致 Kafka 消费者出现 "Failed to get offsets by times"?

spring-boot - Apache Kafka 与 Springboot 连接

java - 卡夫卡与Java : how to re-read data