这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战
ProducerRecord:代表了一组需要发送的消息,它由记录要发送到的主题Topic,可选的分区号Partition 以及可选的键值对构成。
Serializer:在发送ProducerRecord 时,需要将键值对对象由序列化器Serializer 转换为字节数组在网络上传输
Partitioner:如果发送过程中指定了有效的分区号,那么在发送记录时将使用该分区。如果发送过程中未指定分区,则将使用key 的hash 函数映射指定一个分区。如果发送的过程中既没有分区号也没有Key,则将以循环的方式分配一个分区。选好分区后,生产者向其发送数据。这条消息被存放在一个记录批次里,批次里的所有消息会被发送到相同的主题和分区上。由一个独立的线程负责把它们发到Kafka Broker 上。
响应:Broker 在收到消息时会返回一个响应,如果写入成功,返回一个RecordMetaData 对象,它包含了主题和分区信息,以及记录在分区里的偏移量,上面两种的时间戳类型也会返回给用户。如果写入失败,会返回一个错误。生产者在收到错误之后会尝试重新发送消息,几次之后如果还是失败的话,就返回错误消息。
Producer的创建
Producer 有3个必选的属性:bootstrap.servers、key.serializer、value.serializer
boostrap.servers:指定broker 的地址,格式为host:port ,producer 根据一个broker 找到其他broker 信息,因此不需要提供全量的broker 地址,但也不要只给定一个(防止broker 宕机)
key.serializer、value.serializer:生产者需要将消息序列化后传递给broker,serializer表示类以何种方式进行序列化,该属性必须设置一个实现了org.apache.kafka.common.serialization.Serializer
接口的类,主要有:ByteArraySerializer、StringSerializer、IntegerSerializer ,其中 ByteArraySerialize 是 Kafka 默认使用的序列化器。
// 创建 Properties 对象
Properties properties = new Properties();
// 设置bootstrap.servers
properties.put("bootstrap.servers","broker1:9092,broker2:9092");
// 设置序列化器为StringSerializer
properties.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer"); properties.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer");
// 创建一个生产者对象,将属性值传递进来
producer = new KafkaProducer<String,String>(properties);