本源码使用的Kafka Client是0.10.0.1
NetworkClient是一个通用的网络客户端实现,Kafka生产者和消费者都使用NetworkClient组件和服务端Broker之间进行通讯。
public class NetworkClient implements KafkaClient {
private static final Logger log = LoggerFactory.getLogger(NetworkClient.class);
/* the selector used to perform network i/o */
//网络I/O,发送和接受消息
private final Selectable selector;
......
}
NetworkClient中负责网络I/O的是Selectable selector接口,接下来主要分析下Selectable接口的实现Selector类。
Selector类
Selector类(在org.apache.kafka.common.network包下),Selector底层封装了Java NIO,使用一个单独的线程可以管理多条网络连接上的链接、读、写等操作。该类的核心属性如下:
核心属性及作用
//java.nio.channels.Selector类型,用来监听网络I/O事件。
private final java.nio.channels.Selector nioSelector;
//维护了NodeId与KafkaChannel之间的映射关系,表示生产者客户端与各个Node之间的网络链接。
//KafkaChannel是在SocketChannel上的又一层封装。其中Send和NetworkReceive分别表示读和写时用的缓存,此等通过ByteBuffer实现,
//TransportLayer封装了SocketChannel及SelectionKey,TransportLayer根据网络协议的不同,提供不同的子类,而对KafkaChannel提供统一的接口
private final Map<String, KafkaChannel> channels;
//记录已经完全发送出去的请求
private final List<Send> completedSends;
//记录已经完全接受到的请求
private final List<NetworkReceive> completedReceives;
//记录从连接中读取到的消息
//暂停一次OP_READ事件处理完成之后,会将stagedReceives集合中的请求保存到completeReceives集合中
private final Map<KafkaChannel, Deque<NetworkReceive>> stagedReceives;
//记录刚刚创建的连接SelectionKey,因为是异步的,所以不知道该连接是否连接完成
private final Set<SelectionKey> immediatelyConnectedKeys;
//记录一次poll过程中发现的断开链接
private final List<String> disconnected;
//记录一次poll过程中新建立的连接
private final List<String> connected;
//记录向哪些Node发送的请求失败了
private final List<String> failedSends;
//用于创建KafkaChannel的Builder。根据不同配置创建不同的TransportLayer的子类,然后创建KafkaChannel。
private final ChannelBuilder channelBuilder;
//LinkedHashMap类型,用来记录各个链接的使用情况,并根据此关闭空闲时间超过connectionsMaxIdleNanos的链接
private final Map<String, Long> lruConnections;
//连接最大空闲的时间,单位:ns
private final long connectionsMaxIdleNanos;
//最大接受的消息大小
private final int maxReceiveSize;
接下来主要看一下Selector类中的常用方法
构造器
public Selector(int maxReceiveSize, long connectionMaxIdleMs, Metrics metrics, Time time, String metricGrpPrefix, Map<String, String> metricTags, boolean metricsPerConnection, ChannelBuilder channelBuilder) {
try {
this.nioSelector = java.nio.channels.Selector.open(); //创建一个新的nioSelector
} catch (IOException e) {
throw new KafkaException(e);
}
this.maxReceiveSize = maxReceiveSize;
this.connectionsMaxIdleNanos = connectionMaxIdleMs * 1000 * 1000;
this.time = time;
this.metricGrpPrefix = metricGrpPrefix;
this.metricTags = metricTags;
this.channels = new HashMap<>();
this.completedSends = new ArrayList<>();
this.completedReceives = new ArrayList&l

最低0.47元/天 解锁文章
847

被折叠的 条评论
为什么被折叠?



