Kafka服务端源码剖析五 -- Processor线程是如何处理completedReceives请求的?

上次我们分析到Processor线程把请求存入到了completedReceives队列里,我们这次课分析一下,请求存入到completedReceives以后接下来是如何处理的。

我们接着看Processor线程的run方法,前面我们已经分析了 configureNewConnections()方法和 poll()方法。接下来我们看看一下processCompletedReceives()方法:

 private def processCompletedReceives() {
    //TODO 针对completedReceives里的每个请求
    selector.completedReceives.asScala.foreach { receive =>
      try {
        //TODO 从channels里面获取channel
        val channel = selector.channel(receive.source)
        val session = RequestChannel.Session(new KafkaPrincipal(KafkaPrincipal.USER_TYPE, channel.principal.getName),
          channel.socketAddress)
        //TODO 从channels里面获取channel
        val req = RequestChannel.Request(processor = id, connectionId = receive.source, session = session, buffer = receive.payload, startTimeMs = time.milliseconds, securityProtocol = protocol)
        //TODO 把请求存入requestQueue队列
        requestChannel.sendRequest(req)
        //TODO 移除OP_READ事件
        selector.mute(receive.source)
      } catch {
        case e @ (_: InvalidRequestException | _: SchemaException) =>
          // note that even though we got an exception, we can assume that receive.source is valid. Issues with constructing a valid receive object were handled earlier
          error(s"Closing socket for ${receive.source} because of error", e)
          close(selector, receive.source)
      }
    }
  }

我们注意到里面有个重要的操作:把每个获取到的请求封装成了Request对象,然后存入到了RequestChannel的requestQueue队列里。
到此我们总结一下我们看到的所有Server端的网络架构:
在这里插入图片描述

其实到这一讲Kafka Server端这儿的网络架构就很清晰了,使用的是三层架构:Acceptor线程专门用来监听连接请求,如果有了连接请求就把请求交给Processor线程处理,每个线程拥有一个Selector。

每个Selector接受到请求以后,Processor线程把封装到Request的对象统一都存入了RequestChannel的队列。至于为什么这么设计如果没太理解的不着急,等我们把Server端的整个网络部分剖析完了会后我们再进行总结。

这节我们看到请求都到了RequestChannel的requestQueue队列里了,我们猜也能猜得到后面肯定会有线程去处理队列里面的请求,我们下一讲继续剖析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值