kafka2.2源码分析之KafkaChannel

概述

KakfaChannel基本是对SocketChannel的封装,只是这个中间多个一个间接层:TransportLayer,为了封装普通和加密的Channel。TransportLayer子类有PlaintextTransportLayer和SslTransportLayer,分别对应普通和加密的channel。而对于KafkaChannel提供统一的接口,这是策略模式很好的应用。

KafkaChannel不仅封装了SocketChannel,还封装了Kafka自身的认证器Authenticator,和读写相关的NetworkReceive、Send。

kafkaChannel的mute state

kafkaChannel的mute state如下:

  • NOT_MUTED:channel是not muted的,这也是channel的默认状态。
  • MUTED:channel是muted。只有在muted状态的channel才能转化为not muted。
  • MUTED_AND_REPONSE_PENDING:socket server的channel处于muted状态,且socket server未返回任何数据给client(即ack!=0),或者socket server当前正在等待来自api layer的一个响应报文(ack==0)。
  • MUTED_AND_THROTTLED:socket server的channel处于muted状态,且因为quota violation(超出限额)正在限流。
  • MUTED_AND_THROTTLED_AND_RESPONSE_PENDING:socket server的channel处于muted状态,正在限流,并等待结果。
 public enum ChannelMuteState {
        NOT_MUTED,
        MUTED,
        MUTED_AND_RESPONSE_PENDING,
        MUTED_AND_THROTTLED,
        MUTED_AND_THROTTLED_AND_RESPONSE_PENDING
    }

可以改变mute state的socket server事件

  • REQUEST_RECEIVED:从client端接收到一条请求。
  • RESPONSE_SEND:发送一条响应给client端(ack!=0)。或者socket server从api layer接收到心跳(ack==0)。
  • THROTTLE_STARTED:因为quota violation开始限流。
  • THROTTLE_ENDED:限流结束。

每个事件导致的状态转换如下:

  • REQUEST_RECEIVED: MUTED => MUTED_AND_RESPONSE_PENDING
  • RESPONSE_SENT:    MUTED_AND_RESPONSE_PENDING => MUTED,MUTED_AND_THROTTLED_AND_RESPONSE_PENDING => MUTED_AND_THROTTLED
  • THROTTLE_STARTED: MUTED_AND_RESPONSE_PENDING => MUTED_AND_THROTTLED_AND_RESPONSE_PENDING
  • THROTTLE_ENDED:   MUTED_AND_THROTTLED => MUTED, MUTED_AND_THROTTLED_AND_RESPONSE_PENDING => MUTED_AND_RESPONSE_PENDING
     
public enum ChannelMuteEvent {
        REQUEST_RECEIVED,
        RESPONSE_SENT,
        THROTTLE_STARTED,
        THROTTLE_ENDED
    }

KafkaChannel的state

  • NOT_CONNECTED: 未连接。初始状态,在通过transportLayer#finishConnect()完成建立连接后,会更新该状态。如果是plain text channel则将该状态从NOT_CONNECTED转换为READY。其他channel则转换为AUTHENTICATE。
  • AUTHENTICATE: SSL, SASL_SSL 和 SASL_PLAINTEXT channel在整个ssl和sasl握手的期间都处于AUTHENTICATE状态。
  • READY: 已连接,已认证的channel处于READY状态。从READY状态可以转换到EXPIRED, FAILED_SEND 或者 LOCAL_CLOSE。
  • EXPIRED: 当连接一直空闲直到到达超时时间,或者channel关闭了,状态会转换为该EXPIRED状态。
  • FAILED_SEND: 当因为一个发送失败而导致channel关闭时,会转换为该FAILED_SEND状态。
  • LOCAL_CLOSE: 当channel在本地调用close()方法时,会转换为该LOCAL_CLOSE状态。

这些状态可以帮助我们直到一个channel没有连接上的原因。

典型的状态转换如下:

  • PLAINTEXT Good path: NOT_CONNECTED => READY => LOCAL_CLOSE
  • SASL/SSL Good path: NOT_CONNECTED => AUTHENTICATE => READY => LOCAL_CLOSE
  • Bootstrap server misconfiguration: NOT_CONNECTED, disconnected in NOT_CONNECTED state
  • Security misconfiguration: NOT_CONNECTED => AUTHENTICATE => AUTHENTICATION_FAILED, disconnected in AUTHENTICATION_FAILED state
  • Security misconfiguration with older broker: NOT_CONNECTED => AUTHENTICATE, disconnected in AUTHENTICATE state
     
public enum State {
        NOT_CONNECTED,
        AUTHENTICATE,
        READY,
        EXPIRED,
        FAILED_SEND,
        AUTHENTICATION_FAILED,
        LOCAL_CLOSE
    }

KafkaChannel方法讲解

kafkaChannel作为context角色,基本上是调用strategy角色transportLayer的方法,只是会加以Kafkachannel的state或mute state的转换,某些方法的执行会需要通过认证器Authenticator认证。

kafkaChannel transportLayer
perpare() handshake()
disconnect() disconnect()
finishConnect() finishConnect()
isConnect() isConnect()
selectionKey() selectionKey()
mute() removeInterestOps()
maybeUnmute() addInterestOps()
delayCloseOnAuthenticationFailure() removeInterestOps()
completeCloseOnAuthenticationFailure() addInterestOps()
ready() ready()
socketAddress() socketChannel().socket().getInetAddress()
setSend() addInterestOps()
send() removeInterestOps()
hasBytesBuffered() hasBytesBuffered()

 

你可能感兴趣的:(kafka)