Kafka分区机制原理

kafka消息组织结构:
主题-分区-消息

一、为什么分区?

  • 提供负载均衡、动态伸缩的能力
  • 支持局部消息顺序消费

二、分区策略

  • 默认分区策略

    • 轮询(Round-robin)是javaProducerAPI默认策略

    • 随机(Randomness)

    • 按消息键保存。自定义每条消息的消息键,消息键代表业务类型,使相同类型的业务放到同一个partition。因为一个分区只能针对同一个消费者,那么该消费者的消息就是有序的。

      1
      2
      3
      4
      5
      6
      7
      8
         #按key类型划分
      List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
      List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
      return Math.abs(key.hashCode()) % partitions.size();

      #按地区分区,同理可以按Ip地域划分partition。
      List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
      return partitions.stream().filter(p -> isSouth(p.leader().host())).map(PartitionInfo::partition).findAny().get();
  • 自定义分区策略

    需要实现org.apache.kafka.clients.producer.Partitioner接口,设置并设置partitioner.class值为该实现类全路径类名