Producer的设计
这和上面对于Producer的基本使用介绍不一样的是,我们会更加深入的讲解Producer的一些原理和流程。
首先是发送和响应的数据结构
ProducerRecord
一条ProducerRecord封装了一条待发送的消息,整体包含5个字段,
Topic 消息所属的topic
Partition 消息所属的分区
Key
Value
Timestamp 消息时间戳
而在发送给broker之后获得的响应,包含
Offset 日志中的位移信息
Timestamp 消息时间戳
Topic/partition 所属topic的分区
Checksum 消息CRC32吗
SerializedKeySize 序列化的key字节数
SerializedValueSize 序列化的Value字节数
对于整体的工作流程,大概可以概述为,
对于工作线程,首先调用send方法进行发送 Record,然后收到消息后进行序列化,结合本地缓存的元数据确定目标分区,最后写入消息缓冲池。
对于Sender线程,是专门负责将缓冲区的消息发送给broker的线程。
而具体的流程可以分为几步,
第一步,序列化和计算目标分区。
一条消息,序列化后,结合topic元数据,确定分区,实现目标分区的计算
第二步,追加写入到消息缓冲区
Producer创建的时候会创建一个32MB的缓冲区,用于保存消息,其中有一个重要集合保存信息,消息批次信息,batchs,内部维护了一个HashMap,分别保存每个topic下的batch集合,
而一个batch集合,主要的由三个组件组成,分别
Compressor 负责执行追加写入
Batch 缓冲区
Thunks 消息回调逻辑集合
第三步,sender线程预处理并进行消息发送
Sender负责实际的发送操作,基本流程为
获取消息,按照batch的目标分组来发送给不同broker,等待response
最后一步,处理response
Sender发送完成PRODUCE请求给broker,broker请求完成后返回PRODUCE的response
并依次调用batch的回调函数