消费者分配策略

一个consumer group中有多个consumer,一个topic有多个partition,所以必然会涉及到partition的分配问题,即确定哪个partition由哪个consumer来消费,Kafka提供了3种消费者分区分配策略:RangeAssigor、RoundRobinAssignor、StickyAssignor。

​ PartitionAssignor接口用于用户定义实现分区分配算法,以实现Consumer之间的分区分配,消费组的成员订阅它们感兴趣的Topic并将这种订阅关系传递给作为订阅组协调者的Broker,协调者选择其中的一个消费者来执行这个消费组的分区分配并将分配结果转发给消费组内所有的消费者,Kafka默认采用RangeAssignor的分配算法。

RangeAssignor

RangeAssignor对每个Topic进行独立的分区分配

​ 对于每一个Topic,首先对分区按照分区ID进行排序,然后订阅这个Topic的消费组的消费者再进行排序,之后尽量均衡的将分区分配给消费者,这里只能是尽量均衡,因为分区数可能无法被消费者数量整除,那么有一些消费者就会多分配到一些分区

计算规则

上述简单来说就是分区总数/消费线程数,如果有余,则表明有的消费线程之间分配的分区不均匀,那么这个多出来的分区会给前几个消费线程处理。

​ 比如上述7个分区,3个comsumer,则7/3=2,余1,这个表明如果3个消费线程均分7个分区还会多出1个分区,那么这个多出的额外分区就会给前面的消费线程处理,所以它会把第一个分区先给到contomer-1消费线程消费

配置方式

我们只需要如下配置即可以实现如下功能

KafkaConstant.CONSUMER_PROPERTIES.setProperty(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, "org.apache.kafka.clients.consumer.RangeAssignor");
RoundRobinAssignor

将所有可用partitions和consumers展开(字典排序),以轮询的方式将partitions依次分配给consumers。

​ 如果consuemrs订阅Topics都是相同的,那么partitions将会被均匀分配给每个consumer,最理想的状态是partitions数是consumers数的整数倍,这样每个consumer都有相同数量的partitions数。

分配规则

这个分区分配策略简单来说就是列出所有的分区,然后和消费线程之间进行循环的分配即可

​ 如果你需要使用该分配策略,你需要满足所有的消费线程都是消费相同的topic,且每个消费者之间的消费线程数是一样的

配置方式

我们只需要如下配置即可实现该功能

KafkaConstant.CONSUMER_PROPERTIES.setProperty(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, "org.apache.kafka.clients.consumer.RoundRobinAssignor");
StickyAssignor

StickyAssignor分区分配算法,目的是在执行一次新的分配时,能在上一次分配的结果的基础上,尽量少的调整分区分配的变动,节省因分区分配变化带来的开销。

​ Sticky是“粘性的”,可以理解为分配结果是带“粘性的”——每一次分配变更相对上一次分配做最少的变动,其目标有两点:

  • 首先,尽可能保证分区分配均衡(即分配给consumers的分区数最大相差为1);
  • 其次,当发生分区重分配时,尽可能多的保留现有的分配结果。

当这两个目标发生冲突时,优先保证第一个目标,第一个目标是每个分配算法都尽量尝试去完成的,而第二个目标才真正体现出StickyAssignor特性的。

分配规则

StickyAssignor的分配规则很麻烦,主要的作用就是尽量的实现均衡,然后尽量减少分区变化

配置方式
KafkaConstant.CONSUMER_PROPERTIES.setProperty(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, "org.apache.kafka.clients.consumer.StickyAssignor");

原文地址:http://www.cnblogs.com/xieshier/p/16864529.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性