kafka生产者发送消息的分区策略(三种方式)

 

一、直接填写分区号

快捷键ctrl+p 可查看参数列表 partition 表示分区

二、不填写分区号,填写key 按照key的hash值来进行分区

三、只填写value 根据自身粘性机制

(先向一个批次中写数据,达到了一批了统一发送 之后切换一个分区 在写一个批次)

粘性机制:

和下面两个参数有关 满足下方其中一个条件即可

1. 批次大小默认16K * properties.put("batch.size",16384);

2.等待时间 默认0ms * properties.put("linger.ms",1);

public class PartitionWithCallBack {
    public static void main(String[] args) throws InterruptedException {
        //1 创建配置对象
        Properties properties = new Properties();
        //2给配置对象添加参数
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "hadoop102:9092");
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        //非必要参数
        //批次大小默认16K
        properties.put("batch.size",16384);
        //等待时间 默认0ms
        properties.put("linger.ms",1);
        //RecordAccumulator 缓冲区大小 默认32M
        properties.put("buffer.memory",33554432);


        //3创建kafka生产者对象
        //泛型指的是最终发送消息的key可value的类型

        KafkaProducer<String, String> Producer = new KafkaProducer<String, String>(properties);
        //4 调用send方法发送消息
        for (int i = 0; i < 10; i++) {
            //添加回调函数
            //控制消息发送到不同的分区 由消息的参数决定
            //1 直接填写分区号
            Producer.send(new ProducerRecord<>("first","", "atguigu" + i), new Callback() {
                @Override
                public void onCompletion(RecordMetadata metadata, Exception exception) {
                    if (exception!=null){
                        exception.printStackTrace();
                    }else {
                        System.out.println(metadata.topic()+":"+metadata.partition()+":"+metadata.offset());
                    }
                }
            });
        //让它睡眠2ms  使它满足设置的等待时间 会进行数据的分区
            //数据不是发送的时候打印的而是返回ack的时候打印的 所以一个分区里面的数据可能会相邻
        //Thread.sleep(2);
        }
        //5 关闭连接
        //
        Producer.close();

    }
}

以上是本人通过自学的总结,如果对你有帮助的话,可以点个赞哟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值