Netty高性能架構之Reactor模式

      網友投稿 792 2025-04-04

      在討論Netty的架構模式之前,我們先來介紹下Reactor模式,因為Netty的架構模式是在此基礎上演變而來的

      Reactor模式介紹

      1. 線程模型基本介紹

      不同的線程模式,對程序的性能有很大影響,為了搞清Netty 線程模式,我們來系統的講解下 各個線程模式, 最后看看Netty 線程模型有什么優越性.

      目前存在的線程模型有:傳統阻塞 I/O 服務模型 Reactor 模式

      根據 Reactor 的數量和處理資源池線程的數量不同,有 3 種典型的實現

      單 Reactor 單線程;

      單 Reactor 多線程;

      主從 Reactor 多線程

      Netty 線程模式(Netty 主要基于主從 Reactor 多線程模型做了一定的改進,其中主從 Reactor 多線程模型有多個 Reactor)

      2. 傳統阻塞I/O服務模型

      2.1 工作原理

      說明:

      黃色的框表示對象, 藍色的框表示線程,白色的框表示方法(API)

      2.2 模型特點

      采用阻塞IO模式獲取輸入的數據,每個連接都需要獨立的線程完成數據的輸入,業務處理,數據返回

      2.3 問題分析

      當并發數很大,就會創建大量的線程,占用很大系統資源,連接創建后,如果當前線程暫時沒有數據可讀,該線程會阻塞在read 操作,造成線程資源浪費

      3. Reactor模式

      針對傳統阻塞 I/O 服務模型的 2 個缺點,解決方案

      基于 I/O 復用模型:多個連接共用一個阻塞對象,應用程序只需要在一個阻塞對象等待,無需阻塞等待所有連接。當某個連接有新的數據可以處理時,操作系統通知應用程序,線程從阻塞狀態返回,開始進行業務處理Reactor 對應的叫法: 1. 反應器模式 2. 分發者模式(Dispatcher) 3. 通知者模式(notifier)

      基于線程池復用線程資源:不必再為每個連接創建線程,將連接完成后的業務處理任務分配給線程進行處理,一個線程可以處理多個連接的業務。

      I/O 復用結合線程池,就是 Reactor 模式基本設計思想,如圖:

      說明:

      Reactor 模式,通過一個或多個輸入同時傳遞給服務處理器的模式(基于事件驅動)

      服務器端程序處理傳入的多個請求,并將它們同步分派到相應的處理線程, 因此Reactor模式也叫 Dispatcher模式

      Reactor 模式使用IO復用監聽事件, 收到事件后,分發給某個線程(進程), 這點就是網絡服務器高并發處理關鍵

      Reactor:Reactor 在一個單獨的線程中運行,負責監聽和分發事件,分發給適當的處理程序來對 IO 事件做出反應。 它就像公司的電話接線員,它接聽來自客戶的電話并將線路轉移到適當的聯系人;

      Handlers:處理程序執行 I/O 事件要完成的實際事件,類似于客戶想要與之交談的公司中的實際官員。Reactor 通過調度適當的處理程序來響應 I/O 事件,處理程序執行非阻塞操作。

      3.1 單Reactor單線程

      Select 是前面 I/O 復用模型介紹的標準網絡編程 API,可以實現應用程序通過一個阻塞對象監聽多路連接請求

      Reactor 對象通過 Select 監控客戶端請求事件,收到事件后通過 Dispatch 進行分發

      如果是建立連接請求事件,則由 Acceptor 通過 Accept 處理連接請求,然后創建一個 Handler 對象處理連接完成后的后續業務處理

      如果不是建立連接事件,則 Reactor 會分發調用連接對應的 Handler 來響應

      Netty高性能架構之Reactor模式

      Handler 會完成 Read→業務處理→Send 的完整業務流程

      結合實例:服務器端用一個線程通過多路復用搞定所有的 IO 操作(包括連接,讀、寫等),編碼簡單,清晰明了,但是如果客戶端連接數量較多,將無法支撐,前面的 NIO 案例就屬于這種模型。

      優點:模型簡單,沒有多線程、進程通信、競爭的問題,全部都在一個線程中完成

      缺點:性能問題,只有一個線程,無法完全發揮多核 CPU 的性能。Handler 在處理某個連接上的業務時,整個進程無法處理其他連接事件,很容易導致性能瓶頸

      缺點:可靠性問題,線程意外終止,或者進入死循環,會導致整個系統通信模塊不可用,不能接收和處理外部消息,造成節點故障

      使用場景:客戶端的數量有限,業務處理非常快速,比如 Redis在業務處理的時間復雜度 O(1) 的情況

      3.2 單Reactor多線程

      Reactor 對象通過select 監控客戶端請求事件, 收到事件后,通過dispatch進行分發

      如果建立連接請求, 則由Acceptor 通過accept 處理連接請求, 然后創建一個Handler對象處理完成連接后的各種事件

      如果不是連接請求,則由reactor分發調用連接對應的handler 來處理

      handler 只負責響應事件,不做具體的業務處理, 通過read 讀取數據后,會分發給后面的worker線程池的某個線程處理業務

      worker 線程池會分配獨立線程完成真正的業務,并將結果返回給handler

      handler收到響應后,通過send 將結果返回給client

      優點:可以充分的利用多核cpu 的處理能力

      缺點:多線程數據共享和訪問比較復雜, reactor 處理所有的事件的監聽和響應,在單線程運行, 在高并發場景容易出現性能瓶頸.

      3.3 主從Reactor多線程

      針對單 Reactor 多線程模型中,Reactor 在單線程中運行,高并發場景下容易成為性能瓶頸,可以讓 Reactor 在多線程中運行

      Reactor主線程 MainReactor 對象通過select 監聽連接事件, 收到事件后,通過Acceptor 處理連接事件

      當 Acceptor 處理連接事件后,MainReactor 將連接分配給SubReactor

      subreactor 將連接加入到連接隊列進行監聽,并創建handler進行各種事件處理

      當有新事件發生時, subreactor 就會調用對應的handler處理

      handler 通過read 讀取數據,分發給后面的worker 線程處理

      worker 線程池分配獨立的worker 線程進行業務處理,并返回結果

      handler 收到響應的結果后,再通過send 將結果返回給client

      Reactor 主線程可以對應多個Reactor 子線程, 即MainRecator 可以關聯多個SubReactor

      優點:父線程與子線程的數據交互簡單職責明確,父線程只需要接收新連接,子線程完成后續的業務處理。

      優點:父線程與子線程的數據交互簡單,Reactor 主線程只需要把新連接傳給子線程,子線程無需返回數據。

      缺點:編程復雜度較高

      結合實例:這種模型在許多項目中廣泛使用,包括 Nginx 主從 Reactor 多進程模型, Memcached 主從多線程,Netty 主從多線程模型的支持

      3.4 Reactor小結

      單 Reactor 單線程,前臺接待員和服務員是同一個人,全程為顧客服

      單 Reactor 多線程,1 個前臺接待員,多個服務員,接待員只負責接待

      主從 Reactor 多線程,多個前臺接待員,多個服務生

      響應快,不必為單個同步時間所阻塞,雖然 Reactor 本身依然是同步的

      可以最大程度的避免復雜的多線程及同步問題,并且避免了多線程/進程的切換開銷

      擴展性好,可以方便的通過增加 Reactor 實例個數來充分利用 CPU 資源

      復用性好,Reactor 模型本身與具體事件處理邏輯無關,具有很高的復用性

      任務調度 多線程

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:2003excel表格怎么篩選數據透視表(2003excel數據透視表在哪里)
      下一篇:如何在插入的圖片上打字(怎么把在圖片上打字)
      相關文章
      亚洲综合免费视频| 亚洲国产成人久久99精品| 中国china体内裑精亚洲日本| 亚洲精品无码久久久久久久 | 亚洲啪AV永久无码精品放毛片| 亚洲91精品麻豆国产系列在线| 亚洲理论在线观看| 亚洲精品福利网站| 亚洲成a人片毛片在线| 亚洲国产精品线观看不卡| 亚洲码一区二区三区| 亚洲国产av美女网站| 亚洲日本视频在线观看| 亚洲av无码专区在线| 亚洲va久久久久| 亚洲国产欧美日韩精品一区二区三区| 亚洲一久久久久久久久| 亚洲欧美国产日韩av野草社区| 亚洲精品GV天堂无码男同| 国产精品亚洲精品日韩动图| 国产一区二区三区亚洲综合| 亚洲国产人成精品| 亚洲人成网77777亚洲色| 亚洲国产精品VA在线观看麻豆 | 亚洲中文字幕一二三四区| 亚洲国产成人手机在线观看| 色欲aⅴ亚洲情无码AV| 亚洲成人高清在线| 久久综合亚洲色HEZYO国产| 亚洲精品无码Av人在线观看国产| 亚洲AV第一页国产精品| 亚洲网址在线观看| 色老板亚洲视频免在线观| 亚洲成AV人影片在线观看| 亚洲国产精品一区二区九九| 国产亚洲精品成人AA片新蒲金| 亚洲国产精品一区二区成人片国内 | 亚洲精品无码永久在线观看你懂的| 亚洲AV无码成人精品区天堂| 亚洲黄色免费在线观看| 亚洲无码一区二区三区|