Netty中提供了哪些線程模型?
最近,我更新了一些Netty相關的內容,于是有很多粉絲開始私信問我一些關于Netty的問題。今天,給大家分享一個大家問得比較多問題,Netty中提供了哪些線程模型?
說到線程模型,又不得不說Netty中的Reactor,Reactor直譯過來叫做反應堆,它是Netty支持異步多線程的核心組件。常見的Reactor線程模型有三種,分別是:Reactor單線程模型、Reactor多線程模型、主從Reactor多線程模型;
1、單線程單Reactor模型
在Reactor模型有三個重要的組件:
1、Reactor :主要負責將I/O事件發派給對應的Handler
2、Acceptor :用于處理客戶端連接請求
3、Handlers :執行非阻塞的I/O讀寫任務
首先來看單線程單Reactor模型,如圖所示:
單線程Reactor這種實現方式存在缺點,因為,Handler的執行是串行的,如果其中一個Handler處理線程阻塞,將導致其他的業務處理也會阻塞。而Handler和Reactor在同一個線程中的執行,這也將導致無法接收新的請求。
2、多線程單Reactor模型
為了解決單線程Reactor的問題,有人提出使用多線程的方式來處理業務邏輯,也就是在業務處理的地方加入線程池,實現異步處理,這樣將Reactor和Handler就放在不同的線程中來執行,這就是多線程單Reactor模型。
但是,問題又來了,在多線程單Reactor模型中,所有的I/O操作是由一個Reactor來完成,而 運行在單個線程中,它需要處理包括accept()/read() /write()/connect()等操作,在并發量小的情況下影響不大。一旦并發量上來,出現高負載、高并發或大數據量的應用場景時,容易成為瓶頸,主要有以下2個原因:
1、一個NIO線程同時處理成百上千的鏈路,性能上無法支撐,即便NIO線程的CPU 達到100%,也無法滿足海量消息的讀取和發送;
2、當NIO線程負載過重之后,處理速度將變慢,這會導致大量客戶端連接超時,超時之后往往會進行重發,這更加重了NIO線程的負載,最終會導致大量消息積壓和處理超時,成為系統的性能瓶頸;
所以,我們還可以更進一步優化,引入了主從Reactor多線程模式:
3、主從Reactor多線程模型
如圖所示,在主從Reactor多線程模型中,由三個主要的角色:
Main Reactor:負責接收客戶端的連接請求,并將具體的業務IO處理請求轉發給 Sub Reactor(其中Sub Reactor可以有多個)。
Acceptor:請求接收者,它的職責類似服務器,并不真正負責連接請求的建立,而只將其請求委托 Main Reactor 線程池來實現,起到一個轉發的作用。
Sub Reactor:負責數據的讀寫,在 NIO 中 通常注冊通道的讀事件(OP_READ)和寫事件(OP_WRITE)。
好了,以上就是我對Netty線程模型的理解。?