Kafka中的生产者主要是用来向Kafka中写入消息。其包含的主要内容有如下个方面:
01、应用程序往Kafka中写入消息的场景
记录用户的活动(用于审计好分析)、记录度量指标、保存日志消息、记录智能家电的信息、与其他应用程序进行异步通信、缓冲即将写入到数据库的数据,等等。
02、Kafka发送消息的过程
1、创建ProducerRecord对象
2、使用send()发送ProducerRecord对象
3、序列化器把键和值对象序列化成字节数组,以便在网络上传输。
4、分区器根据ProducerRecord对象的键来选择分区,将记录发送到对应的主题和分区的批次里,之后由独立的线程负责把这些记录批次发送到相应的broker上。
5、服务器接收到这些消息时返回一个响应。如果消息成功写入Kafka,就返回一个RecordMetaData对象,否则返回一个错误。
03、Kafka生产者的必选属性
Kafka生产者有3个必选属性:
1、bootstrap.servers:指定broker的地址清单,地址的格式为host:port。
2、key.serialier:指定一个实现了org.apache.kafka.common.serialization.Serializer接口的类,生产者会使用这个类把键对象序列化成字节数组。
3、value.serializer:与key.serializer类似,指定的类会将值序列化。
04、Kafka生产者发送消息的三种方式
1、发送并忘记(fire-and-forget)
把消息发送给服务器,但并不关心它是否正常到达。大多数情况下,消息会正常到达,因为Kafka是高可用的,而且生产者会自动尝试重发。不过,使用这种方式有时候也会丢失一些消息。
2、同步发送
使用send()方法发送消息,它会返回一个Future对象,调用get()方法进行等待,就可以知道消息是否发送成功。
3、异步发送
使用send()方法,并指定一个回调函数,服务器在返回响应时调用该函数。
Kafka可以保证一个分区里的消息是有序的。也就是说,如果生产者按照一定的顺序发送消息,broker就会按照这个顺序把她们写入分区,消费者也会按照同样的顺序读取它们。
05、使用Avro序列化
Apache Avro是一种与编程语言无关的序列化格式。Avro数据通过与语言无关的schema来定义。schema通过JSON来描述,数据被序列化为JSON文件,不过一般会使用二进制文件。Avro在读文件时需要用到schema,schema一般会被内嵌在数据文件里。
Avro有一个特性:当负责写消息的应用程序使用新的schema,负责读消息的应用程序可以继续处理消息而无需做任何改动。这个特性使得它特别适合用在像Kafka这样的消息系统上。
shema与应用版本一致时,会获取完成的数据,不一致时,获取的数据不完整,但是不会产生异常或阻断性错误。
06、分区
ProducerRecord对象包含了目标主题、键和值。键有两个用途:可以作为消息的附加信息,也可以用来决定消息该被写到主题的哪个分区。拥有相同键的消息将被写到同一个分区。