第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Netty Reactor 模型之單線程模型

1. 前言

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

  1. 單 Reactor 單線程;

  2. 單 Reactor 多線程;

  3. 主從 Reactor 多線程。

本節(jié)內(nèi)容,主要講解傳統(tǒng)堵塞 I/O 模型單 Reactor 單線程模型的核心原理。

2. 學(xué)習(xí)目的

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

3. 傳統(tǒng)堵塞 I/O 模型

3.1 模型介紹

圖片描述

上圖是傳統(tǒng)堵塞模型的模型圖,其特點如下所示:

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

  2. 每個線程獨立完成其對應(yīng)的客戶端業(yè)務(wù),讀取數(shù)據(jù)、處理數(shù)據(jù)、響應(yīng)數(shù)據(jù),線程之間互不干擾;

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

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

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

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

3.2 模型優(yōu)化

思考:針對傳統(tǒng)的 I/O 模型的兩個缺點,應(yīng)該如何優(yōu)化呢?

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

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

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

架構(gòu)圖如下所示:

圖片描述

以上架構(gòu)圖分析:

  1. 多路復(fù)用器專門負責(zé)客戶端請求的監(jiān)聽、讀取數(shù)據(jù)、分發(fā)數(shù)據(jù),但是不負責(zé)具體的業(yè)務(wù)處理;

  2. 業(yè)務(wù)處理是非常的復(fù)雜且耗時的,直接丟給線程池去負責(zé)處理;

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

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

4. 單 Reactor 單線程

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

圖片描述

架構(gòu)圖說明

  1. Select 是 I/O 多路復(fù)用模型的標(biāo)準(zhǔn)網(wǎng)絡(luò)編程 API,可以實現(xiàn)應(yīng)用程序通過一個堵塞對象監(jiān)聽多路連接請求。Reactor 對象通過 Select 監(jiān)聽客戶端請求事件,收到事件之后通過 Dispatch 進行分發(fā);

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

  3. 如果事件類型是普通業(yè)務(wù)(比如:客戶端發(fā)送業(yè)務(wù)請求),則創(chuàng)建 Handler 來讀取數(shù)據(jù)、業(yè)務(wù)處理、響應(yīng)數(shù)據(jù)。

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

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

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

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

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

5. 小結(jié)

本節(jié)主要掌握的知識點

  1. 常見的線程模型主要分為傳統(tǒng)的 IO 模型和 Reactor 模型;

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

  3. 傳統(tǒng) IO 模型的缺點是什么,應(yīng)該如何去優(yōu)化;

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