Kafka学习笔记-生产者(一)

417 阅读3分钟

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一样的序列化器。
      • 如果键是整数类型而值是字符串,那么需要使用不同的序列化器。

  • 创建一个生产者代码片段
    • 1、创建一个Properties对象
    • 2、因为我们打算把键和值定义成字符串类型,所以使用的内置的StringSerializer
    • 3、在这里我们创建了一个新的生产对象,并为键和值设置了恰当的类型,然后把Properties对象传给它。
  • 发送消息的方式
    • 发送并忘记(fire-and-forget)
      • 我们把消息发送给服务器,但并不关心它是否正常到达。大多数情况下,消息会正常到达,因为kafka是高可用的,而且生产者会自动尝试重发。
      • 不过这种方式有时候也会丢失一些消息。
    • 同步发送
      • 我们使用send()方法发送消息,它会返回一个Future对象。
      • 调用get方法进行等待,就可以知道是否发送成功。
    • 异步发送
      • 我们调用send()方法,并制定一个回调函数,服务器在返回响应时调用该函数。