[Netty學習筆記]六、Netty概述與線程模型簡介

Netty概述

原生NIO存在的問題
  1. NIO的類庫和API比較繁瑣,使用麻煩。需要熟練掌握Selector/ServerSocketChannel等
  2. 需要具備其他的額外技能,如多線程編程和網路編程等,才能編寫出高質量的NIO程序
  3. 開發工作量和難度非常大,例如客戶端面臨斷連重連、網絡閃斷、半包讀寫、失敗緩存、網絡擁塞和異常流 的處理等等。
  4. JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug,它會導致 Selector 空輪詢,最終導致 CPU 100%。直到 JDK 1.7 版本該問題仍舊存在,沒有被根本解決
Netty的優點

Netty對JDK自帶的NIO的API進行了封裝,解決了上述問題

  1. 設計優雅:適用於各種傳輸類型的統一,基於靈活且可擴展的事件模型,可以清晰地分離關注點;高度可定製的線程模型-單線程,一個或多個線程池
  2. 使用方便
  3. 高性能、吞吐量高 延遲更低 減少資源消耗;最小化不必要的內存複製
  4. 安全:完整的SSL/TLS和StartTLS支持
  5. 社區活躍

線程模型基本介紹

不同的線程模式,對程序的性能有很大影響,目前存在的線程模型有:傳統阻塞IO模型和Reactor模型

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

  1. 單Reactor單線程
  2. 單Reactor多線程
  3. 主從Reactor多線程

Netty線程模式在主從Reactor多線程模型基礎上做了一定的改進。

傳統阻塞IO服務模型

在這裏插入圖片描述

模型優缺點:

每個連接都需要獨立的線程完成數據的輸入,業務處理,數據返回

缺點: 當併發數很大時,就會創建大量的線程,佔用很多的系統資源。並且在連接創建後,如果當前線程暫時沒有數據可讀,該線程會阻塞在read操作,造成線程資源的浪費。

Reactor模式

針對傳統阻塞IO模型的缺點的解決方案:

  1. 基於IO複用模型:多個連接公用一個阻塞對象,應用程序只需要在一個阻塞對象等待,無需阻塞等待所有連接。當某個連接有新數據可以處理時,操作系統通知應用程序,線程從阻塞狀態返回,開始進行業務處理。(與NIO的機制相似)
  2. 基於線程池複用線程資源:不必再爲每個連接創建線程,將連接完成後的業務處理分配給線程池中的空閒線程進行處理。這樣的話,一個線程可以被複用到,可以處理多個連接的業務。

事實上 IO複用結合線程池 就是Reactor模式的設計思想。

在這裏插入圖片描述

圖解說明:

  1. Reactor模式,通過一個或多個輸入同時傳遞給服務處理器的模式(基於時間驅動)
  2. 服務器端程序處理傳入的多個請求,並將他們同步分派到相應的處理線程,因此Reactor模式也叫Dispatcher模式
  3. Reactor模式使用IO複用監聽事件,收到時間後分給某個線程。

Reactor模式中核心組成

  1. Reactor:Reactor在一個單獨的線程中運行,負責監聽和分發時間,分發給適當的處理程序來對IO事件作出反應。它就像公司的電話接線員,它接聽來自客戶的電話並將線路轉移到適當的聯繫人。
  2. Handlers(處理線程):處理程序執行IO事件要完成的實際時間,類似於客戶想要與之交談的公司的實際人員。Reactor通過調度適當的處理程序來響應IO事件,處理程序執行非阻塞操作。
Reactor模式分類
  • 單Reactor單線程
  • 單Reactor多線程
  • 主從Reactor多線程
單Reactor單線程

即NIO使用的模式

在這裏插入圖片描述

說明:

  1. Select是NIO中的API,可以實現應用程序通過一個阻塞對象監聽多路連接請求
  2. Reactor對象通過Select監聽客戶端請求事件,收到時間後通過Dispatch進行分發
  3. 如果是建立連接請求事件,則由Acceptor通過Accept處理連接請求,然後創建一個Handler對象處理連接完成後的後續業務處理
  4. 如果不是建立連接事件,則Reactor會分發調用連接對應的Handler來響應
  5. Handler會完成Read->業務處理->Send的完整業務流程

優缺點:

  • 優點:模型簡單,沒有多線程,進程通信、競爭等問題,全部都在一個線程中完成
  • 缺點:只有一個線程,無法完全發揮多核CPU的性能。Handler在處理某個連接上的業務時,整個進程無法處理其他連接事件,很容易導致性能瓶頸。
  • 缺點:可靠性問題,線程意外終止或者進入死循環,會導致整個系統通信模塊不可用,不能接收和處理外部消息,造成節點故障。

使用場景:客戶端的數量有限,業務處理非常快速

單Reactor多線程

在這裏插入圖片描述

說明:

  1. Reactor對象通過selector監控客戶端請求事件,收到事件後,通過Dispatch進行分發
  2. 如果建立連接請求,則由Acceptor通過accept處理連接請求,然後創建一個Handler對象完成連接後的各種事件
  3. 如果不是連接請求,則由Reactor分發調用連接對應的handler來處理
  4. handler只負責響應事件,不做具體的業務處理,通過read讀取數據後,會分發給後面的worker線程池的某一個線程處理業務
  5. worker線程池會分配獨立線程完成真正的業務,並將結果返回給handler
  6. handler收到響應後,通過send將結果返回給client

優缺點分析:

  1. 優點:可以充分利用多核cpu的處理能力
  2. 缺點:多線程數據共享和訪問比較複雜;reactor處理所有的時間的監聽和響應,但是reactor是在單線程下運行的,在高併發場景容易出現性能瓶頸
主從Reactor多線程

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

在這裏插入圖片描述
注意:上面Reactor子線程的SubReactor中應該沒有Select了(圖片是借鑑自網絡)

說明:

  1. Reactor主線程MainReactor對象通過select監聽連接事件,收到事件後,通過Acceptor處理連接事件
  2. 當Acceptor處理連接事件後,MainReactor將連接分配給SubReactor
  3. SubReactor將連接加入到連接隊列進行監聽,並創建handler進行各種事件處理
  4. 當有新事件發生時,SubReactor就會調用對應的handler處理
  5. handler通過read讀取數據,分發給後面的worker線程處理
  6. Worker線程池分配獨立的worker線程進行業務處理,並返回結果
  7. handler收到響應的結果後,再通過send將結果返回給client
  8. Reactor主線程可以對應多個Reactor子線程,即MainReactor可以關聯多個SubReactor
Reactor模式小結
  1. 單 Reactor 單線程:前臺接待員和服務員是同一個人,全程爲顧客服務
  2. 單 Reactor 多線程:1個前臺接待員,多個服務員,接待員只負責接待
  3. 主從Reactor多線程:多個前臺接待員 多個服務員

Reactor 模式具有如下的優點:

  1. 響應快,不必爲單個同步時間所阻塞,雖然Reactor本身依然是同步的
  2. 可以最大程度的避免複雜的多線程及同步問題,並且避免了多線程、進程的切換開銷
  3. 擴展性好,可以方便的通知增加Reactor實例個數來充分利用CPU資源
  4. 複用性好,Reactor模型本身與具體事件處理邏輯無關,具有很高的複用性
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章