
-
生产者通过
producerRecord对象封装消息主题、消息的value(内容)、timestamp(时间戳)等 -
生产者通过
send()方法发送消息,send()方法会经过如下几步
1. 首先将消息交给拦截器(Interceptor)处理, 拦截器对生产者而言,对所有消息都是生效的,拦截器也支持链式编程(责任器链)的效果,拦截器一般将一些通用的功能加进来,通常在消息发送前,producer回调逻辑前对消息做一些定制化需求,消息头部添加消息的属性等
2. 接下来交给序列化器(Serializer),Key的序列化器和value的序列化器,对消息的key和value进行序列化,序列化为字节数组,
3. 然后将序列化的结果交给分区器(Partitioner),分区器有3种策略来计算消息应该属于哪个分区,-
在producerRecord中直接
指定分区,分区器会直接将消息放到指定分区 -
如果没有指定分区器,但是
消息有key,分区器会根据消息的key计算hash值,根据主题分区数量取模,来决定将消息放到哪个分区 -
如果没有指定分区、也没有指定key,分区器会以
轮询(Round Robin)的方式给消息分配分区在这里插入图片描述
-
-
消息经过以上拦截器->序列化器->分区器 进行加工后,会将消息放到
RecordAccumulator缓冲区,对每个分区都会有一个单独的缓冲区,经过分区器计算出分区号之后,不

本文详细介绍了Kafka生产者发送消息的流程,包括拦截器、序列化、分区策略等步骤,并探讨了如何在消息重试时保持顺序性。通过设置特定参数,如`max.in.flight.requests.per.connection`为1,可以确保消息的有序性。同时,讨论了分批发送消息的好处和重试机制。
最低0.47元/天 解锁文章
808





