天天看点

Kafka是如何应用NIO实现网络通信的?(下)

newConnections

Kafka是如何应用NIO实现网络通信的?(下)

每当Processor线程接收新连接请求,都会将对应SocketChannel放入该队列。

之后调用configureNewConnections创建连接时,就从该队列中取出SocketChannel,然后注册新连接。

inflightResponses

  • 临时Response队列
  • Kafka是如何应用NIO实现网络通信的?(下)
  • 为何是临时?

    有些Response回调逻辑要在Response被返回发送方后,才能执行,因此需要暂存临时队列。

responseQueue

每个Processor线程都会维护自己的Response队列,

而非像网上的某些文章说Response队列是线程共享的或是保存在RequestChannel中的。Response队列里面保存着需要被返还给发送方的所有Response对象。

工作逻辑

configureNewConnections

  • 负责处理新连接请求,注意每个Processor线程都维护着一个Selector类实例。
  • Kafka是如何应用NIO实现网络通信的?(下)

processNewResponses

  • 负责发送Response给Request发送方,并且将Response放入临时Response队列
  • Kafka是如何应用NIO实现网络通信的?(下)

poll

Kafka是如何应用NIO实现网络通信的?(下)

processCompletedReceives

  • 接收和处理Request
  • Kafka是如何应用NIO实现网络通信的?(下)

processCompletedSends

Kafka是如何应用NIO实现网络通信的?(下)

processDisconnected

Kafka是如何应用NIO实现网络通信的?(下)

closeExcessConnections

  • 关闭超限连接
  • Kafka是如何应用NIO实现网络通信的?(下)