Kafka Client源码中的NIO使用

本源码使用的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值