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
值为该实现类全路径类名