kafka分区策略

其实分区的作用就是提供负载均衡的能力,或者说对数据进行分区的主要原因,就是为了实现系统的高伸缩 性(Scalability)。

  • 轮询策略(Round-robin,顺序策略)kafka默认策略

也称Round-robin策略,即顺序分配。 比如一个主题下有3个分区,那么第一条消息被发送到分区0,第二条 被发送到分区1,第三条被发送到分区2,以此类推。当生产第4条消息时又会重新开始,即将其分配到分区 0,就像下面这张图展示的那样。

顺序策略
  • 随机策略
随机策略

自定义实现方式:

List<PartitionInfo> partitions = cluster.partitionsForTopic(topic); 
return ThreadLocalRandom.current().nextInt(partitions.size());
  • 按消息键保存策略
按key分类策略
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic); 
return Math.abs(key.hashCode()) % partitions.size();
  • 基于地理位置分区

这种应用场景更多适用于大型分布式跨区间集群的时候。比如当有一个跨城市集群中有广州机房与北京机房,当用户注册的时候,需要区分是广州用户还是北京用户,如果是广州用户,则广州消费者程序会自动送出一碗“甜豆腐脑”;如果是北京用户,则北京消费者程序会自动送出一碗“咸豆腐脑”。简单的一个实现方式就是创建一个双分区的主题,然后再创建两个消费者程序分别处理南北方注册用户逻辑即可 ,很显然,这里就只需要将北京ip的注册请求发送到北京分区,将广州ip的注册请求发送到广州分区,剩下的工作就交给各自分区的消费端处理即可。

自定义实现方式:

List<PartitionInfo> partitions = cluster.partitionsForTopic(topic); 
return partitions.stream().filter(p -> isSouth(p.leader().host())).map(PartitionInfo::partition).findAny().get();

发表评论

电子邮件地址不会被公开。 必填项已用*标注