Kafka进阶
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.1 Kafka生产者的执行过程

生产者产生的消息发送到Kafka应用程序的发送过程,如图3.1所示。

图3.1 Kafka生产者的执行过程

生产者客户端由两个线程协调运行,这两个线程分别为主线程和Sender线程(发送线程),其中,

• 在主线程中由KafkaProducer创建消息,然后通过可能的拦截器、序列化器和分区器的作用之后缓存到消息累加器(RecordAccumulator,也称消息收集器)中。

• Sender线程负责从RecordAccumulator中获取消息并将其发送到Kafka中。

我们从创建一个KafkaProducer对象开始,它将创建一个ProducerRecord对象。这个对象是Kafka中的一个核心类,它代表生产者发送到Kafka服务器端的一个消息对象,即一个Key-Value的键值对。在ProducerRecord对象中,包含如下信息。

• Kafka服务器端的主题名称(Topic Name)。

• Topic中可选的分区号。

• 时间戳。

• 其他Key-Value键值对。

其中,十分重要的就是Kafka服务器端的主题名称。

ProducerRecord创建成功后,需要经过拦截器、序列化器将其转换为字节数组,这样它们才能够在网络上传输,然后消息到达分区器。分区器的作用是根据发送过程中指定的有效的分区号,将ProducerRecord发送到该分区;如果没有指定Topic中的分区号,则会根据Key进行Hash运算,将ProducerRecord映射到一个对应的分区。

ProducerRecord默认采用当前的时间,用户也在创建ProducerRecord的时候提供一个时间戳。Kafka最终使用的时间戳取决于Topic的配置,而Topic时间戳的配置主要有以下两种:

• CreateTime表示使用生产者产生的时间戳作为Kafka最终的时间戳。

• LogAppendTime表示生产者记录中的时间戳在将消息添加到其日志中时,将由Kafka Broker重写。

ProducerRecord在经过主线程后,最终由发送线程发送到Kafka服务器端。Kafka Broker在收到消息时会返回一个响应,如果写入成功,则返回一个RecordMetaData对象,它包含主题和分区信息,以及记录在分区里的偏移量,上面两种时间戳类型也会返回给用户。如果写入失败,则返回一个错误。生产者在收到错误之后会尝试重新发送消息,几次之后如果还是写入失败,就返回错误消息。