Skip to main content
 首页 » 编程设计

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

2024年10月25日12bluestorm

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

来自卡夫卡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 个流之间重新平衡。每个消费者可以同时从多个流中消费。请注意,这里的流和分区的数量是相等的。如果流的数量超过分区,一些流将不会收到任何消息,因为它们不会被分配任何分区。