Kafka的生产者Producer将消息序列化之后,发送到对应主题的指定分区上。下图为展示了生产者的执行过程。
整个生产者客户端由两个线程协调运行,这两个线程分别为主线程和Sender线程。视频讲解如下:
https://www.bilibili.com/video/BV1wc1QYPEPQ/?aid=113252398797...
1、主线程
在主线程中将创建一个KafkaProducer对象,并由KafkaProducer创建一个ProducerRecord对象。该对象代表了生产者Producer发送到Kafka服务器端的一个消息对象。ProducerRecord对象是一个Key-Value键值对的对象,其中包含了主题名称、主题中的分区号、时间戳以及其他Key-Value键值对,其中最重要的就是Kafka服务器端的主题名称。
ProducerRecord创建成功后,需要经过拦截器、序列化器将其转换为字节数组,这样它们才能够在网络上传输。然后消息到达了分区器。分区器的作用是根据发送过程中指定的有效的分区号,将ProducerRecord发送到该分区中;如果没有指定主题中的分区号,则会根据Key进行哈希运算,将ProducerRecord映射到一个对应的分区。ProducerRecord将默认采用当前的时间作为时间戳,用户也创建ProducerRecord的时候提供一个时间戳。而Kafka最终使用的时间戳取决于主题的配置。下表列举了主题时间戳的两种配置。
2、Sender线程
KafkaProducer创建的消息最终会缓存到生产者的消息累加器中,并由发送线程负责从消息累加器中获取消息并将其发送到KafkaBroker中。
KafkaBroker在收到消息时会返回一个响应给KafkaProducer。如果消息写入成功,KafkaBroker会返回一个RecordMetaData对象,它包含了主题和分区信息,以及消息在分区里的偏移量,同时时间戳也会返回给用户;如果写入失败,KafkaBroker会返回一个错误。生产者在收到错误之后会尝试重新发送消息。几次之后如果还是失败的话,生产者就返回错误消息。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。