亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

首頁 慕課教程 Netty 教程 Netty 教程 Netty Reactor 模型之單線程模型

Netty Reactor 模型之單線程模型

1. 前言

不同的線程模式,對于程序的性能差別是很大的,目前存在的線程模式主要有兩種,分別是傳統堵塞 I/O 服務模型Reactor 模型。其中又根據 Reactor 的數量和處理資源池線程的數量不同具體分為以下幾種模型,具體如下:

  1. 單 Reactor 單線程;

  2. 單 Reactor 多線程;

  3. 主從 Reactor 多線程。

本節內容,主要講解傳統堵塞 I/O 模型單 Reactor 單線程模型的核心原理。

2. 學習目的

學習 Reactor 模型的好處在于可以知道傳統的 I/O 的性能瓶頸在哪里,應該如何去提升性能。Reactor 模型只是純理論上的東西,不涉及具體代碼,并且它并不是只是針對 Netty 的一種理論,而是針對涉及 IO、涉及通信都需要去了解的理論方面的知識。包括常見知名的中間件 Redis、Nginx 等也都是基于這些線程模型去進行優化升級。

3. 傳統堵塞 I/O 模型

3.1 模型介紹

圖片描述

上圖是傳統堵塞模型的模型圖,其特點如下所示:

  1. 每個客戶端連接服務端時,服務端都會為客戶端開辟一個線程專門處理其對應的業務請求;

  2. 每個線程獨立完成其對應的客戶端業務,讀取數據、處理數據、響應數據,線程之間互不干擾;

  3. 如果某個客戶端長時間沒有請求數據時,那么服務端也不會釋放線程,而是線程處于堵塞狀態。

Socket 編程就是傳統 I/O 堵塞模型,其缺點也非常的明顯,具體如下:

  1. 如果客戶端數量很大的情況,會為每個客戶端都創建獨立子線程,那么將消耗服務器大量的資源,增加 CPU 的工作壓力,子線程雖然能提高處理速度,但是使用不合理反而降低服務器的性能;

  2. 如果某個客戶端沒有請求時,它還占用了服務器的資源,負責處理它業務的線程沒有得到釋放,而是一直堵塞于 read() 方法,直到下一次的請求進來。

3.2 模型優化

思考:針對傳統的 I/O 模型的兩個缺點,應該如何優化呢?

主要從兩個方面進行改造,具體如下:

  1. I/O 多路復用: 它是操作系統級別的機制,大概原理是客戶端連接時直接注冊到操作系統的內核,當某個連接有新的數據可以處理時,操作系統通知應用程序,應用程序從堵塞狀態切換到讀取狀態,開始進行業務處理。這種模型也叫反應器模型、分發者模式(Dispatcher)、通知這模式(notifier)。如果所有客戶端都沒有數據可處理時,應用程序只需要堵塞一個地方即可,相比傳統 I/O 模型堵塞于各個線程的 read() 方法,這種模型的性能提高了很多;

  2. 線程池復用線程資源: 應用程序讀取數據時,通過線程池創建子線程去處理業務、響應業務,處理完成之后自動釋放線程,這樣的好處在于 1)無需針對每個客戶端獨立創建子線程;2)子線程處理完成之后自動釋放資源,而不是占著資源不釋放,增加 CPU 的開銷。

架構圖如下所示:

圖片描述

以上架構圖分析:

  1. 多路復用器專門負責客戶端請求的監聽、讀取數據、分發數據,但是不負責具體的業務處理;

  2. 業務處理是非常的復雜且耗時的,直接丟給線程池去負責處理;

  3. 整個架構的堵塞點在多路復用器,線程池則不會堵塞,如果沒用客戶端事件時,線程池可以釋放去做別的事情;

  4. 通過以上的改造,那么整體的架構的性能就會得到不少提升。

4. 單 Reactor 單線程

單 Reactor 單線程模型,和上面的模型優化思路是類似的,具體如下:

圖片描述

架構圖說明

  1. Select 是 I/O 多路復用模型的標準網絡編程 API,可以實現應用程序通過一個堵塞對象監聽多路連接請求。Reactor 對象通過 Select 監聽客戶端請求事件,收到事件之后通過 Dispatch 進行分發;

  2. 如果事件類型是連接請求事件,則由 Acceptor 處理連接請求;

  3. 如果事件類型是普通業務(比如:客戶端發送業務請求),則創建 Handler 來讀取數據、業務處理、響應數據。

這種模式架構簡單,但是存在以下缺點,具體如下:

  1. 如果客戶端的連接數量很多的情況下,將無法支撐,因為負責處理客戶端請求的 Reactor 只有一個;

  2. 負責處理業務的 Handler 只有一個,也就是說只有一個子線程負責處理具體業務,無法很好的利用多核 CPU 的性能;

  3. 如果線程出現問題,比如:意外終止、進入死循環,那么整個系統的通訊功能將會收到影響,造成通訊故障。

單 Reactor 單線程模型,一般適用于客戶端數量比較少,業務處理復雜度很低,處理起來速度非常快的情況,因此真實業務場景不太建議使用。

5. 小結

本節主要掌握的知識點

  1. 常見的線程模型主要分為傳統的 IO 模型和 Reactor 模型;

  2. Reactor 模型又細分單 Reactor 單線程模型、單 Reactor 多線程模型、主從多線程模型;

  3. 傳統 IO 模型的缺點是什么,應該如何去優化;

  4. 單 Reactor 單線程的模型原理是什么,有什么優缺點。