亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

簡單了解Java Netty Reactor三種線程模型

瀏覽:83日期:2022-09-02 11:47:54

1. Reactor三種線程模型

1.1. 單線程模型

Reactor單線程模型,指的是所有的IO操作都在同一個NIO線程上面完成,NIO線程的職責如下:

1)作為NIO服務端,接收客戶端的TCP連接;2)作為NIO客戶端,向服務端發起TCP連接;3)讀取通信對端的請求或者應答消息;4)向通信對端發送消息請求或者應答消息。

Reactor單線程模型示意圖如下所示:

簡單了解Java Netty Reactor三種線程模型

Reactor單線程模型

由于Reactor模式使用的是異步非阻塞IO,所有的IO操作都不會導致阻塞,理論上一個線程可以獨立處理所有IO相關的操作。從架構層面看,一個NIO線程確實可以完成其承擔的職責。例如,通過Acceptor類接收客戶端的TCP連接請求消息,鏈路建立成功之后,通過Dispatch將對應的ByteBuffer派發到指定的Handler上進行消息解碼。用戶線程可以通過消息編碼通過NIO線程將消息發送給客戶端。

對于一些小容量應用場景,可以使用單線程模型。但是對于高負載、大并發的應用場景卻不合適,主要原因如下:1)一個NIO線程同時處理成百上千的鏈路,性能上無法支撐,即便NIO線程的CPU負荷達到100%,也無法滿足海量消息的編碼、解碼、讀取和發送;2)當NIO線程負載過重之后,處理速度將變慢,這會導致大量客戶端連接超時,超時之后往往會進行重發,這更加重了NIO線程的負載,最終會導致大量消息積壓和處理超時,成為系統的性能瓶頸;3)可靠性問題:一旦NIO線程意外跑飛,或者進入死循環,會導致整個系統通信模塊不可用,不能接收和處理外部消息,造成節點故障。

為了解決這些問題,演進出了Reactor多線程模型,如下。

1.2. 多線程模型

Rector多線程模型與單線程模型最大的區別就是有一組NIO線程處理IO操作,它的原理圖如下:

簡單了解Java Netty Reactor三種線程模型

Rector多線程模型

Reactor多線程模型的特點:

1)有專門一個NIO線程-Acceptor線程用于監聽服務端,接收客戶端的TCP連接請求;2)網絡IO操作-讀、寫等由一個NIO線程池負責,線程池可以采用標準的JDK線程池實現,它包含一個任務隊列和N個可用的線程,由這些NIO線程負責消息的讀取、解碼、編碼和發送;3)1個NIO線程可以同時處理N條鏈路,但是1個鏈路只對應1個NIO線程,防止發生并發操作問題。

在絕大多數場景下,Reactor多線程模型都可以滿足性能需求;但是,在極個別特殊場景中,一個NIO線程負責監聽和處理所有的客戶端連接可能會存在性能問題。例如并發百萬客戶端連接,或者服務端需要對客戶端握手進行安全認證,但是認證本身非常損耗性能。在這類場景下,單獨一個Acceptor線程可能會存在性能不足問題,為了解決性能問題,產生了第三種Reactor線程模型-主從Reactor多線程模型。

1.3. 主從多線程模型

主從Reactor線程模型的特點是:服務端用于接收客戶端連接的不再是個1個單獨的NIO線程,而是一個獨立的NIO線程池。Acceptor接收到客戶端TCP連接請求處理完成后(可能包含接入認證等),將新創建的SocketChannel注冊到IO線程池(sub reactor線程池)的某個IO線程上,由它負責SocketChannel的讀寫和編解碼工作。Acceptor線程池僅僅只用于客戶端的登陸、握手和安全認證,一旦鏈路建立成功,就將鏈路注冊到后端subReactor線程池的IO線程上,由IO線程負責后續的IO操作。

主從多線程模型如下圖所示:

簡單了解Java Netty Reactor三種線程模型

主從多線程模型

利用主從NIO線程模型,可以解決1個服務端監聽線程無法有效處理所有客戶端連接的性能不足問題。

它的工作流程總結如下:

1)從主線程池中隨機選擇一個Reactor線程作為Acceptor線程,用于綁定監聽端口,接收客戶端連接;Acceptor線程接收客戶端連接請求之后創建新的SocketChannel,將其注冊到主線程池的其它Reactor線程上,由其負責接入認證、IP黑白名單過濾、握手等操作;

2)步驟2完成之后,業務層的鏈路正式建立,將SocketChannel從主線程池的Reactor線程的多路復用器上摘除,重新注冊到Sub線程池的線程上,用于處理I/O的讀寫操作。

2. Netty線程模型

2.1. Netty線程模型分類

事實上,Netty的線程模型與1.2章節中介紹的三種Reactor線程模型相似,下面章節我們通過Netty服務端和客戶端的線程處理流程圖來介紹Netty的線程模型。

2.1.1. 服務端線程模型一種比較流行的做法是服務端監聽線程和IO線程分離,類似于Reactor的多線程模型,它的工作原理圖如下:

簡單了解Java Netty Reactor三種線程模型

2.1.2. 客戶端線程模型

相比于服務端,客戶端的線程模型簡單一些,它的工作原理如下:

簡單了解Java Netty Reactor三種線程模型

2.2. Reactor線程NioEventLoop

NioEventLoop是Netty的Reactor線程,它的職責如下:

作為服務端Acceptor線程,負責處理客戶端的請求接入; 作為客戶端Connecor線程,負責注冊監聽連接操作位,用于判斷異步連接結果; 作為IO線程,監聽網絡讀操作位,負責從SocketChannel中讀取報文; 作為IO線程,負責向SocketChannel寫入報文發送給對方,如果發生寫半包,會自動注冊監聽寫事件,用于后續繼續發送半包數據,直到數據全部發送完成; 作為定時任務線程,可以執行定時任務,例如鏈路空閑檢測和發送心跳消息等; 作為線程執行器可以執行普通的任務線程(Runnable)。

2.3. NioEventLoop設計原理

我們知道當系統在運行過程中,如果頻繁的進行線程上下文切換,會帶來額外的性能損耗。多線程并發執行某個業務流程,業務開發者還需要時刻對線程安全保持警惕,哪些數據可能會被并發修改,如何保護?這不僅降低了開發效率,也會帶來額外的性能損耗。

串行執行Handler鏈

為了解決上述問題,Netty采用了串行化設計理念,從消息的讀取、編碼以及后續Handler的執行,始終都由IO線程NioEventLoop負責,這就意外著整個流程不會進行線程上下文的切換,數據也不會面臨被并發修改的風險,對于用戶而言,甚至不需要了解Netty的線程細節,這確實是個非常好的設計理念,它的工作原理圖如下:

簡單了解Java Netty Reactor三種線程模型

一個NioEventLoop聚合了一個多路復用器Selector,因此可以處理成百上千的客戶端連接,Netty的處理策略是每當有一個新的客戶端接入,則從NioEventLoop線程組中順序獲取一個可用的NioEventLoop,當到達數組上限之后,重新返回到0,通過這種方式,可以基本保證各個NioEventLoop的負載均衡。一個客戶端連接只注冊到一個NioEventLoop上,這樣就避免了多個IO線程去并發操作它。

Netty通過串行化設計理念降低了用戶的開發難度,提升了處理性能。利用線程組實現了多個串行化線程水平并行執行,線程之間并沒有交集,這樣既可以充分利用多核提升并行處理能力,同時避免了線程上下文的切換和并發保護帶來的額外性能損耗。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 国产51自产区在线 | 欧美午夜免费一级毛片 | 99re8在这里只有精品23 | 真人一级毛片免费观看视频 | 免费看影片的网站入口 | 四川丰满护士毛茸茸 | 久久精品国产99国产精品 | 天堂亚洲欧美日韩一区二区 | 免费国产一区 | 国产在线精品福利一区二区三区 | 一级黄色大片网站 | 草草影视在线观看 | 国产精品亚洲综合第一区 | 尤物视频在线免费 | 亚洲一区二区日韩欧美gif | 久久99青青久久99久久 | 久久在线免费 | 久久精品国产74国产 | 亚州一区二区 | 欧美日韩一区二区在线观看 | 国产乡下三级全黄三级带 | 久久男人| 一级片aa| 免费xxx成年大片 | 日韩成人在线观看视频 | 久久丝袜美腿 | 精品热线九九精品视频 | 黄色片免费的 | 91尤物在线视频 | 日韩欧美中文字幕一区 | 一区二区精品 | 国产高清资源 | 青青综合| 在线观看亚洲一区二区 | 日本69sex护士泡妞 | 激情丝袜欧美专区在线观看 | 国产片翁熄系列乱在线视频 | 国产在线观看成人免费视频 | 一级裸片| 精品国产日韩久久亚洲 | 亚洲黄色在线播放 |