第3章 kafka生产者—向Kafka写入数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010819416/article/details/83964324

可以使用Kafka内置的客户端API开发Kafka应用程序。

3.1 生产者概述
在这里插入图片描述

3.2 创建Kafka生产者
Kafka生产者有3个必选的属性:
*bootstrap.servers
指定broker的地址清单,地址的格式为host:port
*key.serializer
设置为实现一个org.apache.kafka.common.serialization.Serializer接口的类,生产者会使用这个类把键对象序列化为字节数组。默认提供:ByteArraySerializer、StringSerializer、IntegerSerializer。
*value.serializer
指定类将值序列化
创建一个新的生产者:

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
Producer<String, String> producer = new KafkaProducer<>(props);

实例化生产者对象后,就可以发送消息了。发送消息有3种方式:
1)发送并忘记(fire-and-forger)
并不关心它是否正常到达
2)同步发送
send()方法返回Future对象
3)异步发送
send()方法,指定一个回调函数,服务器在返回响应时调用该函数。

3.3 发送消息到Kafka

ProducerRecord<String, String> record = new ProducerRecord<>("CustomerCountry", "Precision Products", "France");//目标主题的名字和要发送的键和值对象
try{
    producer.send(record);
} catch (Exception e) {
    e.printStackTrace();
}

3.3.1 同步发送消息

 ProducerRecord<String, String> record = new ProducerRecord<>("CustomerCountry", "Precision Products", "France");//目标主题的名字和要发送的键和值对象
 try{
     producer.send(record).get();
     //send()方法返回一个Future对象,get()方法等待Kafka响应,如果没有发送错误,会得到一个RecordMetadata对象,可以用它
     //获取消息的偏移量
 } catch (Exception e) {
     e.printStackTrace();
 }

3.3.2 异步发送消息

 private static class DemoProducerCallback implements Callback {
        @Override
        public void onCompletion(RecordMetadata recordMetadata, Exception e) {
            if(e != null) {
                e.printStackTrace();
            }
        }
    }
//异步发送消息
ProducerRecord<String, String> record = new ProducerRecord<>("CustomerCountry", "Biomedical Materials", "USA");
producer.send(record, new DemoProducerCallback());

3.4 生产者的配置

1、acks
acks参数指定了必须要有多少个分区副本收到消息,生产者才会认为消息写入是成功的。

2、 buffer.memory
设置生产者内存缓冲区的大小,生产者用它缓冲要发送到服务器的消息。

3、compression.type
消息发送不会被压缩,参数可以设置为snappy,gzip或lz4,指定了消息被发送给broker之前使用哪一种压缩算法进行压缩。

4、retries
生产者从服务器收到的错误有可能是临时性的错误,在这种情况下,retries参数的值决定了生产者可以重发消息的次数。

5 batch.size
当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个可以使用的内存大小,按照字节数计算。

6 linger.ms
该参数指定了生产者在发送批次之前等待更多消息加入批次的时间。

7 client.id
可以是任意的字符串,服务器用它来识别消息的来源

8 max.in.flight.requests.per.connection
该参数指定了生产者在收到服务器响应之前可以发送多少个消息

9 timeout.msrequest.timeout.ms和metadata.fetch.timeout.ms
request.timeout.ms指定了生产者在发送数据时等待服务器返回响应的时间;
metadata.fetch.timeout.ms指定了生产者在获取元数据时等待服务器返回响应的时间;
timeout.ms指定了broker等待同步副本返回消息确认的时间

10 max.block.ms
该参数指定了在调用send()方法或使用partitionsFor()方法获取元数据时生产者的阻塞时间。

11 max.request.size
该参数用于控制生产者发送的请求大小

12 receive.buffer.bytes 和send.buffer.bytes
分别指定了TCP socket接收和发送数据包的缓冲区大小。

3.5 序列化器

3.5.1 自定义序列化器

3.5.2 使用Avro序列化
Apache Avro是一种与编程语言无关的序列化格式。
Avro数据通过与语言无关的schema来定义。schema通过JSON来描述,数据被序列化成二进制文件或JSON文件。
特性:当负责写消息的应用程序使用了新的schema,负责读消息的应用程序可以继续处理消息而无需做任何改动。

3.5.3 在Kafka里使用Avro

3.6 分区
ProducerRecord对象包含了目标主题、键和值。
Kafka的消息是一个个键值对,ProducerRecord对象可以只包含目标主题和值,键可以设置为默认的null。
键有两个用途:可以作为消息的附加信息,也可以用来决定消息该被写到主题的哪个分区。
如果键值为null,并且使用了默认的分区器,那么记录将被随机地发送到主题内各个可用的分区上。
如果键不为null,并且使用了默认的分区器,那么Kafka会对键进行散列,然后根据散列值把消息映射到特定的分区上。

  • 实现自定义分区策略

3.7 旧版的生产者API

3.8 总结

猜你喜欢

转载自blog.csdn.net/u010819416/article/details/83964324
今日推荐