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的回调函数

图片

发表评论

邮箱地址不会被公开。 必填项已用*标注