文章目录
一、生产者分区写入策略
Producer 发送消息到 Topic 时,会根据不同的策略将数据分配到不同的 Partition 中
1.1 分区策略
1.1.1 指定分区(与写入策略无关)
若 Producer 在发送消息时指定了 Partition,就直接发送到这个 Partition,与分区策略无关
1.1.2 轮询策略
若没有指定 Partition 和 Key,就使用轮询策略
1.1.3 按 key 分配策略
若没有指定 Partition,但是指定了 key,就按照 key 的 hash 值选择 Partition
1.1.4 随机策略
每次都是随机的将消息分配到每个分区,在较早的版本中是默认的分区策略
1.1.5 自定义分区策略
如果对提供的分区策略都不满意,那么可以自定义分区策略,相关步骤如下
1、实现org.apache.kafka.clients.producer.Partitioner
接口
2、在 Kafka 生产者配置中,配置自定义分区器的类名
public interface Partitioner extends Configurable, Closeable {
/**
* 主要功能:计算分区号
* @param topic 主题
* @param key 键
* @param keyBytes 序列化后的键
* @param value 值
* @param valueBytes 序列化后的值
* @param cluster 集群的元数据信息
* @return Kafka 的分区号
*/
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster);
/**
* 主要功能:在关闭分区器的时候用来回收一些资源
*/
public void close();
}
二、 消息乱序问题
- 轮询策略和随机策略,造成Kafka 中的数据是乱序存储的
- 按 key 分区,一定程度上可以实现数据的有序存储——局部有序,但是又可能会造成数据倾斜