Kafka分区策略选择需结合业务场景,核心原则包括保证顺序性、均衡负载、减少抖动,以下是关键策略及适用场景:
key.hashCode() % 分区数,相同Key消息进入同一分区。null时默认使用。Partitioner接口,根据业务规则(如用户地域、业务类型)指定分区。// 按用户ID分区
public class UserIdPartitioner implements Partitioner {
public int partition(String topic, Object key, byte[] keyBytes, ...) {
return Integer.parseInt(key.toString()) % cluster.partitionCountForTopic(topic);
}
}
需通过partition.assignment.strategy配置,核心目标是均衡负载+快速恢复:
分区数 = 消费者数量 × 目标并行度,预留10%-20%缓冲分区应对流量波动。kafka-consumer-groups.sh监控分区消费进度,识别热点分区(如某分区延迟显著高于其他)。kafka-topics.sh --alter --partitions 新分区数,需注意可能导致Key映射变化。# 指定自定义分区器(如按用户ID分区)
partitioner.class=com.example.UserIdPartitioner
# Kafka 2.4+默认使用StickyAssignor,无需额外配置
# 若需强制使用,可显式指定
partition.assignment.strategy=org.apache.kafka.clients.consumer.StickyAssignor
参考来源: