先分享点课外知识–Kafka分区策略:
众所周知,一个topic有多个partitions,kafka默认一个分区只能被一个消费者消费,一个消费者可以消费多个分区,但是当消费者大于分区时就会出现多出来的消费者分配不到分区,凭空浪费资源的问题。
Kafka提供了消费者客户端参数:partition.assignment.strategy用来设置消费者和分区之间的分配策略,默认值为:RangeAssignor,除此之外还有两种 RoundRobinAssignor和StickyAssignor。
今天主要说一下RangeAssignor策略,它的原理是按消费者总数和分区总数进行整除得到一个跨度,然后将分区按照跨度平均给每个消费者。该策略会把消费者按照名字的字典序排序,然后为每个消费者划分固定的分区范围。如果不能平均分配,就把多出来的分区分配给字典序靠前的分区。弊端是分区数多的话对于个别靠前的消费者来说压力比较大。
假设n=分区数/消费者数量,m=分区数%消费者数量,那么前m个消费者每个分配n+1个分区,后面的(消费者数量-m)个消费者每个分配n个分区。
RoundRobin 策略:将所有主题的分区组成TopicAndPartition列表,然后对TopAndPartition列表按照hashcode进行排序。
目前kafka还不能自定义分区分配策略,只能通过partition.assignment.strategy参数选择range或roundrobin。 partition.assignment.strategy参数默认的值是range。
主要代码如下:
public void pressKfkMsg(int processNum){
if(pool == null){
pool = Executors.newFixedThreadPool(processNum);
}
KafkaConsumerUtil consume