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长啥样
再来看一下代码定义,以加深映象:ConcurrentMap<TopicPartition, Deque>
先判断如些partion有消息可以发送,判断一个批次满足什么样的条件可以发送出去。如果该批次满足发送条件,我们可以通过该批次找到它对应的分区的leader partition对应的broker主机。
步骤二 判断该批次能否发送
满足以下五个条件
1)full:如果一个批次写满了(无论时间有没有到)
2)expired:时间到了(批次没写满也得发送
3)exhausted:内存不够(消息发送出去后,就会释放内存)
4)closed:关闭
5)flushInProgress:将内存数据写回到磁盘
筛选可以发送请求的broker
kafka的网络设计
先上图
Selector是一个nio多路复用器接口,用于执行无阻塞的多连接网络I/O。此类与{NetworkSend}和{NetworkReceive}一起工作,以传输按大小分隔的网络请求和响应。
TransportLayer是底层通信的传输层。它对SocketChannel作了简单的包装,用来替代SocketChannel 和其他网络通道实现。随着NetworkClient取代BlockingChannel和其他实现,我们将使用KafkaChannel作为网络I/O通道。
发送网络请求
响应消息流转
未完待续。。。。