Kafka生产调优相关配置参数设置

包含Kafka保证数据不丢失配置,压缩设置、批次大小设置、每批次消息发送延迟、发送消息缓冲区大小、发送消息每条消息大小设置等。


 Properties props = new Properties();

		//配置服务
        props.put("bootstrap.servers","nwh120:9092,nwh121:9092,nwh122:9092");
        //配置key和value的序列化器
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        //如果要想保证数据不丢失,得如下设置:
        // min.insync.replicas = 2
        // acks = -1
        // retries = Integer.MAX_VALUE
        props.put("acks", "-1");
        //如果消息发送失败,就会重试,这里的3次代表重试的次数
        props.put("retries", 3);
        //重试的时间间隔
        props.put("retry.backoff.ms",5000);

        //设置是否开启压缩,默认是none不压缩
		//如果要压缩的话,建议设置lz4,经过实际检验,效果还是不错的
        props.put("compression.type","lz4");
        //发送一次消息的批次大小,如果批次太小,会导致网络请求频繁,
		//建议设置大一些,默认16384Byte(16k),建议调大,这里用32k
        props.put("batch.size", 32384);
        //批次达到时间就发送。默认是0,意思是消息必须立即被发送,建议100ms
        props.put("linger.ms", 100);
        //设置的缓冲区大小,默认33554432(32M),一般不用动
		//验证何时该调整缓冲区的大小:
		//用一般Java获取结束时间和开始时间: System.currentTime()
		//当结束时间减去开始时间大于设置的linger.ms(100ms),此时Sender线程处理速度慢,需要调大缓冲区大小。
        props.put("buffer.memory", 33554432);

        //发送消息的最大大小,默认是1048576(1M),上限可以调大到10M
        props.put("max.request.size",10485760);
        //保证一个消息发送成功,再发另外一个消息,保证单分区有序
        props.put("max.in.flight.requests.per.connection",1);
		//最大阻塞时间,RecordAccumulator缓存不足时或者没有可用的元数据时,KafkaProducer的send()方法调用要么被阻塞,要么抛出异常,此参数的默认值为60000,即60s
        props.put("max.block.ms", 3000);

        // 创建一个Producer实例
        KafkaProducer<String, String> producer = 
				new KafkaProducer<String, String>(props);
        // 有序性考虑,可以指定生产者的key
        ProducerRecord<String, String> record = 
				new ProducerRecord<>("mytopic", "mykey", "myvalue");


		//可以计算开始时间
		long startTime=System.currentTime();
        //发送消息的模式有两种,一种是异步的,一种是同步的,我们在实际生产中一般是使用异步的发送方式
        producer.send(record, new Callback() {
            @Override
            public void onCompletion(RecordMetadata metadata, Exception exception) {
                if(exception == null) {
                    // 消息发送成功
                    System.out.println("消息发送成功");
                } else {
                    // 消息发送失败,需要重新发送
                }
            }

        });
		//计算结束时间
		long endTime=System.currentTime();
		if(endTime - startTime > 100){//说明内存被压满了
 			//说明有问题,考虑调大buffer.memory
		}
        

        // 这是同步发送的模式
		//producer.send(record).get();

        producer.close();
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小雏菊的成长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值