kafkatemolate send 方法获取返回值 kafka sender_服务器

Kafka Sender线程运行初探

步骤一

1、获取元数据据

步骤二

2、判断哪些partition有消息可以发送
3、判断partition下的这些批次可以发送出去的条件
4、根据元数据信息获取到这个partition的leader partition对应的broker主机
5、哪些broker需要发送消息

步骤三

1、标识还没有拉取到元数据的topic

步骤四

检查与要发送数据主机的网络是否已经建立好。

步骤五

需要发送的partition会有很多个,一些partition的leader partitioin 很有可能是在同一台服务器上。
假设我们集群只有3台服务器 0,1,2,有4个分区的消息要处理:p0,p1,p2,p3
p0:leader -> 0
p1:leader -> 0
p2:leader -> 1
p3:leader -> 2
当我们的分区个数大于集群节点个数,一定会有多个leader partition在同一台服务器上。为提高效率对消息按broker进行分组,同一个broker的partition为同一组
0:{p0,p1} ->批次
1:{p2}
2:{p3}
一个批次就一个请求 -> broker

步骤六 超时批次处理

步骤七 创建发送消息请求

步骤八 调用NetworkClient发送数据。

NetworkClient完成发送请求、接受响应、处理响应、拉取元数据等工作。

ReadyCheck,检查是否可以发送

步骤一 遍历batch里的对象,先上一张图看一下batch长啥样

kafkatemolate send 方法获取返回值 kafka sender_发送消息_02


再来看一下代码定义,以加深映象:ConcurrentMap<TopicPartition, Deque>

先判断如些partion有消息可以发送,判断一个批次满足什么样的条件可以发送出去。如果该批次满足发送条件,我们可以通过该批次找到它对应的分区的leader partition对应的broker主机。

步骤二 判断该批次能否发送

满足以下五个条件
1)full:如果一个批次写满了(无论时间有没有到)
2)expired:时间到了(批次没写满也得发送
3)exhausted:内存不够(消息发送出去后,就会释放内存)
4)closed:关闭
5)flushInProgress:将内存数据写回到磁盘

筛选可以发送请求的broker

kafkatemolate send 方法获取返回值 kafka sender_kafka_03

kafka的网络设计

先上图

kafkatemolate send 方法获取返回值 kafka sender_元数据_04


Selector是一个nio多路复用器接口,用于执行无阻塞的多连接网络I/O。此类与{NetworkSend}和{NetworkReceive}一起工作,以传输按大小分隔的网络请求和响应。

TransportLayer是底层通信的传输层。它对SocketChannel作了简单的包装,用来替代SocketChannel 和其他网络通道实现。随着NetworkClient取代BlockingChannel和其他实现,我们将使用KafkaChannel作为网络I/O通道。

发送网络请求

kafkatemolate send 方法获取返回值 kafka sender_kafka_05

响应消息流转

kafkatemolate send 方法获取返回值 kafka sender_元数据_06

未完待续。。。。