consumer采用pull(拉)的模式从broker中获取数据,pull的优势是可以根据消费者自身的消费能力获取数据,缺点是,如果kafka没有数据,消费者可能会陷入循环中,一直返回空数据。
因为push的模式很难适应消费者速率不同的消费者,因为消息发送速率是由broker决定的。
2、分区分配策略一个消费者组(consumer group)里有多个消费者(consumer),一个主题(topic)有多个分区(partition),所以会有分区分配策略。
kafka有两种分配策略,一个是RoundRobin(轮循发送),一种是Range(范围)。
1.RoundRobin(轮循送)
轮循发送,重点关注消费者组,会将所有消费者组订阅的数据组合起来全部进行排序,然后轮循发送到各个组中。这种模式下,可能会出现某一个组中的有些消费者收到了未订阅的主题的数据。
例如:A B为组1,C为组2,当采用轮循的模式,会将两组中消费者订阅的所有主题中的数据组合排序起来,然后轮循发送到1 2 两组中的A B C消费者,这种情况下会造成可能将 T2主题的数据发送到 1 组中的消费者A中去。
2.Range(范围)
范围发送,这种模式重点先关注哪一个消费者关注的主题,然后在关注组中。
例如:如上图采用Range模式,由于订阅T1主题的是消费者 A B C ,而消费者 C 是消费者2组中的,只有C 一个消费者,所以,会将 T1 主题的数据发送给 C ,由于A B C 订阅主题T1 ,A B同属于消费者组1,所以会将 T1 主题的数据发送给 A B ,A分到T1主题的0和1,B分到 2 ,然后消费组1中的消费者B,订阅了T2主题,则会将T2主题的数据也发送给B。
3、事务kafka的事务,保证了kafka的生产者精准一次性写入kafka集群,消费者精准一次性读取数据,生产和消费可以跨分区、跨会话,要么都成功,要么都失败。



