社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
Kafka的分区分配主要包括三点:生产者的分区分配,消费者的分区分配,broker端的分区分配。
1、生产者的分区分配
Producer调用send方法发送消息到broker时,中间可能会经过拦截器、序列化器、分区器,当消息ProducerRecord指定了partition字段,则就不需要分区器的作用,会直接发送到指定的partition中,如果没有指定partition字段,那么就会采用分区器为其分配分区,分区器的作用就是为消息分配分区。
Kafka中默认的分区器是DefaultPartitioner,它实现了Partitioner接口,我们也可以自定义分区器,自定义分区的逻辑;
在默认分区器中,当消息的key为null时,会采用轮询的方式将消息发送到主题内任意的一个可用分区中;当消息的key不为null时,会取key的哈希值来算出对应的分区号(所有分区中的任意一个),相同的哈希值会被分配到相同的分区;
2、消费者的分区分配
每一个分区中只能被同一个消费者组中的一个消费者消费,消费者的分区分配指的是为消费者组中的消费者分配订阅主题中的分区。
如上图所示,假设该主题中有四个分区,两个消费者组都订阅了该主题,那么按照Kafka的默认规则,消费者组A会为每个消费者分配1个分区,消费者组B会为每个消费者分配2个分区,两个消费者组互不干扰,都只消费分配到各自分区中的消息;
消费者的分区分配策略默认为RangeAssignor,Kafka提供了三种策略:RangeAssignor、RoundRobinAssignor、StickyAssignor;当然也可以自定义实现消费者分分区分配策略(实现ParitionAssignor接口)。
3、Broker端的分区分配
broker端分区分配指的是创建主题时,各个分区的副本分别分配在哪几个broker上的一种分配方法;生产者的分区分配指的是消息应该发送到哪个分区中,消费者的分区分配指的是为消费者指定为其消费的分区。
在创建主题时,如果指定了副本的分配参数(replica-assignment参数),那么按照参数中的分配方案来进行分区副本的创建;如果没有指定该参数,那就按照内部的逻辑来计算分配方案,使用kafka-topic.sh脚本来创建主题时,内部按照机架信息来划分为两种策略:未指定机架信息和指定机架信息;
未指定机架信息:所有的broker节点都没有设置broker.rack参数,或者使用disable-rack-aware参数来创建主题。反之则使用指定机架信息的分配策略来分配分区副本。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!