kafka里consumer采用的是pull的方式从broker里取数据
-
push推的方式很难适应消费速率不同的消费者,消息发送速率是有broker决定的,典型的问题表现是消费端拒绝访问和网络堵塞
-
pull的方式的消费速率是由consumer来确定,如果kafka的topic里没有数据,consumer会长期获取空数据,kafka会在消费时传入一个timeout,如果拉取没有数据,就会等待timeout时长后再返回
Kafka消费分区访问策略:
一个consumer group中有多个consumer,一个topic里有多个partition,这就涉及了partition的分配问题,确定那个partition由哪个consumer来消费
kafka有三种分配策略:range(范围模式,默认的),roundrobin(均衡),sticky(粘性方式v0.11新增)
- range:默认的分区消费策略
无论多少个分区,只有一个消费者,那么所有分区都分配给这个消费者,每次新的消费者加入消费者组都会触发新的分配
分配策略:
-
按照topic进行一组来分配给订阅了这个topic的consumer group中的consumer
-
n=分区数/消费者数量,m=分区数%消费者数量,第一个消费者分配n+m个分区,后面的分配n个分区
-
roundrobin:负载均衡的方式
按照消费者组里的消费者进行平均分配,可以通过配置:partition.assignment.strategy,负载均衡也要看是否订阅了这个topic,每次新的消费者加入消费者组都会触发新的分配
-
Sticky:粘性策略
kafka的v0.11版本引入的:class org.apache.kafka.clients.consumer.StickyAssignor
主要实现的目录
-
分区的分配要尽可能的均匀
-
分区的分配尽可能的和上次分配保持一致
-
当两者冲突时,第一个目标优先第二个目标
-
来源:oschina
链接:https://my.oschina.net/u/4080405/blog/4289319