kafka分区分配策略

 如下图,有两个主题,每个主题有3个分区,两个消费者组,组1有两个消费者A和B,并且都订阅了T1,但是B同时还订阅了T2,而组2有一个消费者,只订阅了T1,所以这里就有分区的分配策略问题了

kafka的分区分配策略有两种:roundrobin和range

如果使用roundrobin,也就是以消费者组为中心,把消费者组里所有的消费者订阅的主题作为一个整体轮询的发送给消费者组里的消费者进行消费,也就是说总共有6个分区,轮询的发送给Group1,这就有一个问题,即:A并没有订阅T2,但是T2的消息就有可能被A消费到

所以采用range的策略,这也是kafka默认的策略,以主题为中心,比如T1有3个分区,group1有两个消费者,那么使用3/2,除不尽,那就有一个消费者多消费一个,即:P0,P1给A消费,P2给B消费,但这样同样有个问题,A没有订阅T2,只有B订阅了,那么T2的消息会发送给A消费吗,答案是否定的,T2的3个分区全部由B来消费 

所以range的策略是主题先是看哪个消费者订阅了它,然后才考虑消费者组,比如T1发现A,B和C都订阅了它,但是又发现A,B是一个组,所以对A,B采用除2的分配策略,而C只有它自己订阅了,所以T1的就都给C,但是range策略有个问题是分配不均衡的问题,比如现在P0,和P1都分配给了A,P2分配给了B,如果Group1订阅的主题很多,那么A消费的分区要比B消费的多很多

但是RoundRobin是先看组,它先拿到一个组,看这个组里的消费者都订阅了哪些主题,把这些主题包括在一个大圈子里,轮询的发送给这个组里的消费者,也不管某个消费者有没有订阅该主题,只要你在这个消费者组里,就会发送给你,所以这是一个问题,所以使用轮询分配策略的前提是一个消费者组里所有的消费者订阅的主题都是一样的,可以订阅多个主题,但是要订阅某个主题,所有的消费者都得订阅

Q:kafka为什么确保同一个分区只能由同一个Consumer Group下的同一个消费者消费?

A: 原因主要考虑一下两点:

1)如果同一个Group下的多个消费者可以同时消费一个分区的消息,那么要保证分区的消息被顺序消费,就务必要对这些消费者加锁,因为如果第一个消费者消费了一条消息,还没结束,另一个消费者又消费了下一条消息,这就不能保证消息消费的顺序性,除非加悲观锁,这样就导致kafka的吞吐量下降,所以kafka综合考虑同一个partition只允许一个group下的一个consumer去消费

2)在高并发的场景,可能会有多个消费者同时消费了同一条消息的可能

おすすめ

転載: blog.csdn.net/Maxiao1204/article/details/119977151
おすすめ