1、生产者概览
尽管生产者API使用起来很简单,但是消息发送过程还是有点儿复杂
- 我们从创建一个ProducerRecord对象开始,
- ProducerRecord对象需要包含目标主题和要发送的内容。
- 我们还可以指定键或分区。
- 在发送ProducerRecord对象时,生产者需要先把键和值对象序列化成字节数组,这样他们才能在网络上传输。
- 接下来数据传给分区器,
- 如果之前在ProducerRecord对象里面指定了分区,那么分区器不会再做任何操作,直接把指定的分区返回。
- 如果没有指定分区,那么分区器会根据ProducerRecord对象的键来选择一个分区。
- 选好分区之后,生产者就知道网哪个主题的哪个分区发送这条记录了。
- 批次记录与发送
- 这条记录会被添加到一个记录批次里,这个批次里的所有消息会被发送到相同的主题和分区上。
- 有一个独立的线程负责把这些记录批次发送到相应的broker上。
- 服务器接收消息
- 服务器在收到消息时会返回一个响应。
- 如果消息写入成功。就会返回一个RecordMetaData对象,它包含了主题和分区信息,以及记录了分区里的偏移量。
- 如果写入失败,则会返回一个错误,生产者在收到错误之后尝试重新发送消息。
- 几次之后如果还是失败,就返回错误信息。
2、创建Kafka生产者
- kafka生产者有三个必要属性
- bootStrap.servers:该属性指定了broker地址清单,地址格式为host:port。
- 清单里不需要包含所有的broker地址,生产者会从给定的broker里查找其他的broker的信息
- 不过建议至少提供两个broker信息,一旦其中一个宕机,生产者任然能够连接到集群上。
- key.serializer :必须设置为一个实现了Serializer接口的类,生产者会使用这个类把键对象序列化为字节数组。
- Kafka客户端默认提供了ByteArraySerializer,StringSerializer和InterSerializer。
- 如果你只使用集中常见的java对象类型,那么就没必要实现自己的序列化器。
- 要注意,key.serializer是必须设置的,就算你打算只发送值的内容。
- value.serializer:与key.serializer一样,value.serializer指定的类会将值序列化。
- 如果键和值都是字符串,可以使用与key.serializer一样的序列化器。
- 如果键是整数类型而值是字符串,那么需要使用不同的序列化器。
- bootStrap.servers:该属性指定了broker地址清单,地址格式为host:port。
- 创建一个生产者代码片段
- 1、创建一个Properties对象
- 2、因为我们打算把键和值定义成字符串类型,所以使用的内置的StringSerializer
- 3、在这里我们创建了一个新的生产对象,并为键和值设置了恰当的类型,然后把Properties对象传给它。
- 发送消息的方式
- 发送并忘记(fire-and-forget)
- 我们把消息发送给服务器,但并不关心它是否正常到达。大多数情况下,消息会正常到达,因为kafka是高可用的,而且生产者会自动尝试重发。
- 不过这种方式有时候也会丢失一些消息。
- 同步发送
- 我们使用send()方法发送消息,它会返回一个Future对象。
- 调用get方法进行等待,就可以知道是否发送成功。
- 异步发送
- 我们调用send()方法,并制定一个回调函数,服务器在返回响应时调用该函数。
- 发送并忘记(fire-and-forget)