一、生产者
1.一个应用程序在很多情况下需要往kafka写入消息:
记录用户的活动(用于审计和分析)、记录度量指标、保存日志消息、记录智能家电的信息、与其他应用程序进行异步通讯、缓冲即将写入的数据库数据等。
2.kafka生产者组件图
我们从创建一个ProducerRecord对象开始,ProducerRecord需要包含目标主题和要发送的内容。我们还可以指定键或分区。在发送ProducerRecord时,要先把键和值对象序列化成字节数组,这样他们才能在网络上传输。
接下来,数据被传递给分区器。如果之前在ProducerRecord里指定了分区,那么分区器就不会再做任何事情,直接把指定的分区返回。否则,分区器会根据ProducerRecord的键来选择一个分区。选好分区以后,生产者就知道该往哪个主题和分区发送这条记录了。紧接着,这条记录被添加到一个记录批次里,这个批次里的所有消息会被发送到相同的主题和分区上。有一个独立的线程负责把这些记录批次发送到相应的broker上。
服务器在收到这些消息时,会返回一个响应。如果消息成功写入kafka,就返回一个RecordMetaData对象,它包含了主题和分区信息,以及记录在分区里的偏移量。如果写入失败则会返回一个错误。生产者在收到错误之后会尝试重新发送消息,几次之后如果还是失败,就会返回错误信息。
3.创建kafka生产者
kafka生产者创建时,有三个必选属性:
bootstrap.servers
该属性指定broker的地址清单,地址的格式为host:port。清单里不需要包含所有的broker地址,生产者会从给定的broker里查找到其它的broker信息。不过建议至少要提供两个broker的信息,一旦其中一个宕机,生产者仍然能够连接到集群上。
key.serializer、value.serializer
broker希望接收到消息的键和值都是字节数组。生产者接口允许使用参数化类型,因此可以把Java对象作为键和值发送给broker。这样的代码具有良好的可读性,不过生产者需要知道如何把Java对象转化成字节数组。key.serializer必须被设置为一个实现了org.apacha.kafka.common.serialization.Serializer接口的类。
4.生产者的配置参数:
acks、buffer.memory、compression.type、retries、batch.size、linger.ms。。。
第四章 4.8 64页