其他分享
首页 > 其他分享> > kafka 生产者发送消息的分区策略

kafka 生产者发送消息的分区策略

作者:互联网

生产者发送消息的分区策略

分区是实现负载均衡以及高吞吐量的关键。

Kafka为了增加系统的伸缩性(Scalability),引入了分区(Partitioning)的概念。

Kafka 中的分区机制指的是将每个主题划分成多个分区(Partition),每个分区是一组有序的消息日志。主题下的每条消息只会保存在某一个分区中,而不会在多个分区中被保存多份。

通过这个设计,就可以以分区这个粒度进行数据读写操作,每个Broker的各个分区独立处理请求,进而实现负载均衡,提升了整体系统的吞吐量。

分区策略是决定生产者将消息发送到哪个分区的算法。

默认的分区器

org.apache.kafka.clients.producer.internals.DefaultPartitioner

创建消息时,根据你的参数决定发送到哪个分区:

轮询策略

即按消息顺序进行分区顺序分配(比如图中消息顺序1,2,3,4...会按顺序分配在各个分区中)

image-20220724094925728

随机策略

这是老版本Kafka的默认策略。

Key-ordering策略

有点类似哈希桶算法,对于有key的数据,用key的哈希值对分区数取模计算对应的分区。

List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
return Math.abs(key.hashCode()) % partitions.size();

Kafka默认:

自定义分区策略:

Step1: 定义类实现 Partitioner 接口

Step2: 重写 partition()方法。

Step3: 设置partitioner.class。

@Component
public class MyPartitioner implements Partitioner {

    @Override
    public int partition(String topic, Object key, byte[] keyBytes,
                         Object value, byte[] valueBytes, Cluster cluster) {
        String msgValues = value.toString();
        int partition;
        if (msgValues.contains("test")){
            partition = 0;
        }else {
            partition = 1;
        }
        return partition;
    }
    @Override
    public void close() {
        //Nothing to close
    }
    @Override
    public void configure(Map<String, ?> configs) {

    }
}

标签:策略,分区,partition,Kafka,发送,随机,key,kafka
来源: https://www.cnblogs.com/shix0909/p/16575672.html