(一)发送过程
1、图解:
(1)如果制定了分区,则分区器不再做分区操作
(2)序列化器将键和值序列化成二进制数组进行网络传输
(3)每个批次的记录被发送到同一个主题的一个分区。(此发送操作由一个专门的线程完成)
(4)成功返回的元数据信息(RecordMetedata):主题、分区、写入时对应的偏移量。
(二)生产者必选属性
1、bootstrap.servers:host:port的格式。生产者能够从给定的broker里查找到其他broker的信息。建议写两个以上,防止一台宕机。
2、key.serializer:必须是实现了。org.apache.kafka.cof11f110n.se 「ialization.Se 「iali.ze「接口的类。
3、value.serializer
注:以上三个是必须设置的参数
4、acks:指定必须有多少个分区副本收到消息,生产者才会认为消息写入是成功的。
acks = 0表示不需要等待任何节点收到消息
acks = 1表示需要等到首领节点收到消息,集群才会返回响应
acks = all表示需要等到所有参与复制的节点收到消息,集群才会返回响应
5、buffer.memory:生产者内存缓冲区的大小,用来缓冲要发送到服务器的消息。
6、compression.type:消息发送时压缩类型,默认不压缩
7、retries:生产者重发消息的次数,默认每次重发之间会等待100ms,可以通过retry.backoff.ms来改变这个时间间隔。
8、batch.size:当有多个消息会被发送到同一个分区时,生产者会将其放到同一个批次里,此参数指定的是同一个批次可以使用的内存大小。当批次被填满时,该批次会被发送。
9、linger.ms:生产者等待一个批次填满的等待时间
10、client.id:任意字符串,服务器会用其来识别消息的来源
11、max.in.fight.requests.per.connection:生产者在收到响应之前可以发送多少消息
12、timeout.ms:broker等待同步副本返回消息确认的时间,与acks相配
13、request.timeout.ms:生产者在发送数据时等待服务器返回响应的时间
14、metadata.fetch.timeout.ms:生产者在获取元数据(比如目标分区的首领是谁)时等待服务器响应的时间
15、max.block.ms:发送数据时缓冲池已满,或者获取元数据没有可用的元数据时阻塞时间
16、max.request.size:生产者发送的请求大小(单个请求的消息最大值)
17、receive.buffer.bytes/send.buffer.bytes:Tcp socket接收和发送数据的缓冲区大小
(四)发送消息
1、发送消息的方式:
(1)发送并忘记:发送后不关心是否到达
(2)同步发送:send(),返回Future对象,调用其get()方法,可以知道是否发送成功
(3)异步发送:调用send(),指定一个回调函数,服务器响应时调用该函数。
注:回调函数需实现:org.apache.kafka.client.producer.callback
2、kafkaProducer错误:
(1)可重试错误:如连接超时等
(2)不可重试错误:如消息过大
(五)分区
1、默认分区器:散列(kafka自定义散列算法)分区