上文可知,Selector管理了所有的Channel,而KafkaChannel则是与某个broker连接的具体通道。Selector的各类网络请求也均交给KafkaChannel来执行。
需要说明的是,KafkaChannel其实是通道注册的时候attach在SelectionKey上的,也就是KafkaChannel与SelectionKey是1对1的关系。以下是KafkaChannel所对外暴露的方法
除了网络相关的操作外,KafkaChannel还有一个很重要的特性,就是缓存当天通道的即将要发送的数据,以及接收到的数据
- private NetworkSend send;
- private NetworkReceive receive;
当然放在这里的数据都是已经经过编解码完毕的数据
小结:3个类的总代码行数超过了3000行,是Producer发送消息的核心类,我们先对这3个类有个大致的概念,以及它们每个类主要实现的功能点,这样非常有益于对整体的认知。至于Kafka将网络操作的相关操作抽象为这3个类是否合理,就仁者见仁智者见智了,其实这3个类是nio及Kafka自身业务的混合体,它的核心就是为Kafka的客户端网络请求提供服务;笔者认为虽然这样的设计并没有把一些特性或者功能的界限画的很清楚,但是整体运行Kafka的网络功能还是游刃有余的
六、数据准备
单纯地将数据放入聚合器Accumulator还不算是数据准备完成,消息发送需要将其转换为面向字节的网络协议的格式,才是真正具备待发送的前提