天天看點

Socket接收器——Acceptor

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扔進線程池;

        }

    }

}

<a target="_blank" href="https://item.jd.com/12185360.html">點選訂購作者《Tomcat核心設計剖析》</a>