头图

Kafka的生产者Producer将消息序列化之后,发送到对应主题的指定分区上。下图为展示了生产者的执行过程。
image.png

整个生产者客户端由两个线程协调运行,这两个线程分别为主线程和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最终使用的时间戳取决于主题的配置。下表列举了主题时间戳的两种配置。
image.png

2、Sender线程

KafkaProducer创建的消息最终会缓存到生产者的消息累加器中,并由发送线程负责从消息累加器中获取消息并将其发送到KafkaBroker中。

KafkaBroker在收到消息时会返回一个响应给KafkaProducer。如果消息写入成功,KafkaBroker会返回一个RecordMetaData对象,它包含了主题和分区信息,以及消息在分区里的偏移量,同时时间戳也会返回给用户;如果写入失败,KafkaBroker会返回一个错误。生产者在收到错误之后会尝试重新发送消息。几次之后如果还是失败的话,生产者就返回错误消息。


赵渝强老师
33 声望14 粉丝

20年以上的IT行业从业经历,清华大学计算机软件工程专业毕业,京东大学大数据学院院长,Oracle中国有限公司高级技术顾问;曾在BEA、甲骨文、摩托罗拉等世界500强公司担任高级软件架构师或咨询顾问等要职,精通大...