kafka分区策略

1.默认的分区策略:Range Startegy(根据范围消费)

Range startegy是对每个主题而言的 , 首先对同一个主题里面的分区按照序号进行排序,并对消费者按照字母进行排序。在对十个分区排序的话是0-9;消费者线程排完序是C1-0,C2-0,C2-1。然后用partitions的总数除以消费者的总数来决定每个消费者线程消费几个分区。如果有余数,那么前面的几个消费者线程将会多消费一个分区。在我们的例子里面,我们有十个分区,三个消费者线程,10/3=3---1,那么消费者线程C1-0    将会多消费一个分区,所以最后分区分配的结构看起来是这样的:

C1-0将消费0,1,2,3分区

C2-0将消费4,5,6分区

C2-1将消费7,8,9分区

如果有第十一个分区的话,那么分区是这样的

C1-0将消费0,1,2,3分区
C2-0将消费4,5,6,7分区

C2-1将消费8,9,10分区

如果我们有2个主题(T1和T2),分别都有十个分区,那么最后的分配结果是:

 C1-0将消费T1主题中的0,1,2,3分区以及T2主题中0,1,2,3分区

 C2-0将消费T1主题中的4,5,6分区以及T2主题中的4,5,6,分区

 C2-1将消费T1主题中的7,8,9分区以及T2主题中的7,8,9分区

这就是消费的策略! 就是用总的分区数/消费者线程总数=每个消费者线程应该消费的分区数。当还有余数的时候就将余数分别分发到另外的消费组线程中。

在这里我们不难看出来。C1-0消费者线程比其他消费者线程多消费了两个分区,这就是Range Strategy的一个明显的弊端。 当分区很多的时候,会有个别的线程压力巨大!

2.第二个默认的分区策略:RoundRobin strategy(轮询的消费策略)

在使用RoundRobin Starategy的时候我们必须满足两个条件:

1、同一个consumer Group里面的所有消费者的num.streams必须相等;

2、每个消费者订阅的 主题必须相同

在这里我们假设2个消费者的num.streams=2. RoundRobin starategy的工作原理: 将所有主题的分区组成TopicAndPartition列表,然后对TopAndPartition列表按照hashcode进行排序,

最后按照round-robin风格将分区分别分配给不同的消费者线程。

在我们的例子中,假如按照hashcode排序完的topic-partition组依次为T1-5,T1-3,T1-0.T1-8.T1-2,T1-1,T1-4,T1-6,T1-9,我们的消费者线程排序为C1-0, C1-1 ,C2-0,C2-1,最后分区分配结果为:

C1-0将消费T1-5 , T1-2 , T1-6 分区;

C1-1将消费T1-3 , T1-1 , T1-9 分区;
C2-0将消费T1-0 , T1-4分区;

C2-1将消费T1-8 , T1-7分区;

遗憾的是,目前我们还不能自定义分区分配策略,只能通过partition.assignment.strategy参数选择range或roundrobin。 partition.assignment.strategy参数默认的值是range。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值