引子
上一篇介绍了KafkaProducer的初始化的过程,这一篇将会介绍KafkaProducer消息发送流程,同样以源码中的examples为例。
我们实现的回调方法,用于提供请求完成的异步处理,这种方法将在已确认发送到服务器的记录时调用。
深入Producer的发送方法
这一篇文章只会对发送的总体做一个介绍,后面的文章将对每个步骤进行深入的去分析。
异步将记录发送到主题,并在确认发送后调用提供的回调。发送是异步的,一旦记录存储在等待发送的记录缓冲区中,此方法将立即返回。这允许并行发送多个记录,而无需在每个记录之后等待响应。
发送的结果是一个RecordMetadata,指定将记录发送到的分区、分配的偏移量和记录的时间戳。如果主题使用CreateTime,则时间戳将是用户提供的时间戳,如果用户没有为记录指定时间戳,则时间戳将是记录发送时间。如果主题使用LogAppendTime,则在追加消息时,时间戳将是Kafka代理的本地时间。
因为send调用是异步的,所以它返回将分配给此记录的RecordMetadata的未来。在这个将来调用get()将被阻塞,直到相关的请求完成,然后返回记录的元数据,或者引发发送记录时发生的任何异常。
send方法总共将分为八个步骤:
步骤一:同步等待拉取元素据
步骤二:对消息的key和value进行序列化
步骤三:根据分区器选择消息应该发送的分区
步骤四:确认一下消息的大小是否超过了最大值上篇介绍初始化的时候设置了这个值max.request.size
步骤五:根据元素据,封装分区对象
步骤六:给每一条消息都绑定他的回调函数
步骤七:把消息放入accumulator,然后accumulator把消息封装成一个批次的去发送
步骤八:唤醒sender线程。他才是真正的发送数据的线程
总结
这一篇知识介绍了Kafka Producer发送的一个总体的流程,接下来的几篇文章将介绍元素据的拉取、如何选择分区、RecordAccumulator的追加方式等进行一个深入的分析。
如果你对发送的流程感兴趣的话,请加个关注哦,谢谢你的支持!