且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Socket接收器——Acceptor

更新时间:2022-08-14 22:23:06

Acceptor是JIoEndpoint的内部类,主要的职责就是监听是否有客户端套接字连接并接收socket,再将socket交由任务执行者(Executor)执行。不断从系统底层读取socket,接着做尽可能少的处理(***就是接收到后不做任何处理),最后扔进线程池。为什么强调要做尽可能少的处理?这里关系到系统性能问题,过多的处理会严重影响吞吐量。因为tomcat默认只有一个接收器(一条线程负责套接字接收工作),所以它对每次接收处理的时间长短将很可能对整体性能产生影响。

于是接收器所干的活都是非常少且简单的,仅仅维护了几个状态变量、流量控制闸门的累加操作、serverSocket的接收操作、设置接收到的socket的一些属性、将接收到的socket放入线程池以及一些异常处理。其他需要较长时间处理的逻辑就交给了线程池,例如对socket底层数据的读取,对http协议报文的解析及响应客户端的一些操作等等。很精妙地将事务剥离,远远提升了系统处理响应性能。

Socket接收器——Acceptor

图Acceptor

用一个简化的代码表示接收器处理的过程则是

publicclass Acceptor implements Runnable{

    public void run(){

        while(true){

           limitLatch.countUpOrAwait();//流量控制闸门信号量加一

           Socket socket =serverSocket.accept();

           将接收的socket扔进线程池;

        }

    }

}


点击订购作者《Tomcat内核设计剖析》