1. 程式人生 > >[netty]--Reactor執行緒模型以及在netty中的應用

[netty]--Reactor執行緒模型以及在netty中的應用

說道netty的執行緒模型,我們第一反應就是經典的Reactor執行緒模型,下面我們就來一起探討一下三種經典的Reactor執行緒模型:

這裡我們需要理解的一點是Reactor執行緒模型是基於同步非阻塞IO實現的。對於非同步非阻塞IO的實現是Proactor模型。

本文主要包括
(1)Reactor單執行緒模型

(2)Reactor多執行緒模型

(3)主從Reactor多執行緒模型

(4)netty的多執行緒模型

1.Reactor單執行緒模型

Reactor單執行緒模型就是指所有的IO操作都在同一個NIO執行緒上面完成的,也就是IO處理執行緒是單執行緒的。NIO執行緒的職責是:
(1)作為NIO服務端,接收客戶端的TCP連線;

(2)作為NIO客戶端,向服務端發起TCP連線;

(3)讀取通訊對端的請求或則應答訊息;

(4)向通訊對端傳送訊息請求或則應答訊息。

Reactor單執行緒模型圖如下所示:
單執行緒Reactor

Reactor模式使用的是同步非阻塞IO(NIO),所有的IO操作都不會導致阻塞,理論上一個執行緒可以獨立的處理所有的IO操作(selector會主動去輪詢哪些IO操作就緒)。從架構層次看,一個NIO執行緒確實可以完成其承擔的職責,比如上圖的Acceptor類接收客戶端的TCP請求訊息,當鏈路建立成功之後,通過Dispatch將對應的ByteBuffer轉發到指定的handler上,進行訊息的處理。

對於一些小容量的應用場景下,可以使用單執行緒模型,但是對於高負載、大併發的應用場景卻不適合,主要原因如下:
(1)一個NIO執行緒處理成千上萬的鏈路,效能無法支撐,即使CPU的負荷達到100%;

(2)當NIO執行緒負載過重,處理效能就會變慢,導致大量客戶端連線超時然後重發請求,導致更多堆積未處理的請求,成為效能瓶頸。

(3)可靠性低,只有一個NIO執行緒,萬一執行緒假死或則進入死迴圈,就完全不可用了,這是不能接受的。

基於上訴問題,提出了Reactor的多執行緒模型:

2.Reactor多執行緒模型

Reactor多執行緒模型與單執行緒模型最大的區別在於,IO處理執行緒不再是一個執行緒,而是一組NIO處理執行緒。原理如下圖所示:
這裡寫圖片描述

Reactor多執行緒模型的特點如下:
(1)有一個專門的NIO執行緒—-Acceptor執行緒用於監聽服務端,接收客戶端的TCP連線請求。

(2)網路IO操作—-讀寫等操作由一個專門的執行緒池負責,執行緒池可以使用JDK標準的執行緒池實現,包含一個任務佇列和N個可用的執行緒,這些NIO執行緒就負責讀取、解碼、編碼、傳送。

(3)一個NIO執行緒可以同時處理N個鏈路,但是一個鏈路只對應一個NIO執行緒。

Reactor多執行緒模型可以滿足絕大多數的場景,除了一些個別的特殊場景:比如一個NIO執行緒負責處理客戶所有的連線請求,但是如果連線請求中包含認證的需求(安全認證),在百萬級別的場景下,就存在效能問題了,因為認證本身就要消耗CPU,為了解決這種情景下的效能問題,產生了第三種執行緒模型:Reactor主從執行緒模型。

3.主從Reactor多執行緒模型

主從Reactor執行緒模型的特點是:服務端用於接收客戶端連線的不再是一個單獨的NIO執行緒,而是一個獨立的NIO的執行緒池。Acceptor接收到客戶端TCP連線請求並處理完成後(可能包含接入認證),再將新建立的SocketChannel註冊到IO執行緒池(sub reactor)的某個IO處理執行緒上並處理編解碼和讀寫工作。Acceptor執行緒池僅負責客戶端的連線與認證,一旦鏈路連線成功,就將鏈路註冊到後端的sub Reactor的IO執行緒池中。 執行緒模型圖如下:
這裡寫圖片描述

利用主從Reactor模型可以解決服務端監聽執行緒無法有效處理所有客戶連線的效能不足問題,這也是netty推薦使用的執行緒模型。

4. netty的執行緒模型

netty的執行緒模型是可以通過設定啟動類的引數來配置的,設定不同的啟動引數,netty支援Reactor單執行緒模型、多執行緒模型和主從Reactor多執行緒模型。
這裡寫圖片描述

服務端啟動時建立了兩個NioEventLoopGroup,一個是boss,一個是worker。實際上他們是兩個獨立的Reactor執行緒池,一個用於接收客戶端的TCP連線,另一個用於處理Io相關的讀寫操作,或則執行系統的Task,定時Task。

Boss執行緒池職責如下:
(1)接收客戶端的連線,初始化Channel引數
(2)將鏈路狀態變更時間通知給ChannelPipeline

worker執行緒池作用是:
(1)非同步讀取通訊對端的資料報,傳送讀事件到ChannelPipeline
(2)非同步傳送訊息到通訊對端,呼叫ChannelPipeline的訊息傳送介面
(3)執行系統呼叫Task;
(4)執行定時任務Task;

通過配置boss和worker執行緒池的執行緒個數以及是否共享執行緒池等方式,netty的執行緒模型可以在單執行緒、多執行緒、主從執行緒之間切換。

為了提升效能,netty在很多地方都進行了無鎖設計。比如在IO執行緒內部進行序列操作,避免多執行緒競爭造成的效能問題。表面上似乎序列化設計似乎CPU利用率不高,但是通過調整NIO執行緒池的執行緒引數,可以同時啟動多個序列化的執行緒並行執行,這種區域性無鎖序列執行緒設計效能更優。

nettyd的NioEventLoop讀取到訊息之後,直接呼叫ChannelPipeline的fireChannelRead(Object msg),只要使用者不主動切換執行緒,一直都是由NioEventLoop呼叫用使用者的Handler,期間不進行執行緒切換,這種序列化設計避免了多執行緒操作導致的鎖競爭,效能角度看是最優的。

5. netty的執行緒模型 設定最佳實踐

(1)建立兩個NioEventLoopGroup,隔離NIO Acceptor和NIO的IO執行緒。

(2)儘量不要在ChannelHandler中啟動使用者執行緒(解碼之後,將POJO訊息派發到後端的業務執行緒池除外)。

(3)解碼要放在NIO執行緒呼叫的Handler中,不要放在使用者執行緒中解碼。

(4)如果IO操作非常簡單,不涉及複雜的業務邏輯計算,沒有可能導致阻塞的磁碟操作、資料庫操作、網路操作等,可以再NIO執行緒呼叫的Handler中完成業務邏輯,不要切換到使用者執行緒。

(5)如果IO業務操作比較複雜,就不要在NIO執行緒上完成,因為阻塞可能會導致NIO執行緒假死,嚴重降低效能。這時候可以把POJO封裝成Task,派發到業務執行緒池中由業務執行緒處理,以保證NIO,執行緒被儘快的釋放,處理其餘的IO操作。

相關推薦

[netty]--Reactor執行模型以及netty應用

說道netty的執行緒模型,我們第一反應就是經典的Reactor執行緒模型,下面我們就來一起探討一下三種經典的Reactor執行緒模型: 這裡我們需要理解的一點是Reactor執行緒模型是基於同步非阻塞IO實現的。對於非同步非阻塞IO的實現是Pr

死磕Netty原始碼之Reactor執行模型詳解(二)NioEventLoop的執行

前言 在上一篇部落格介紹了NioEventLoop的啟動流程,這篇部落格將介紹NioEventLoop的執行流程 NioEventLoop執行 NioEventLoop的執行在run方法中完成,程式碼如下 protected void run()

死磕Netty原始碼之Reactor執行模型詳解(一)NioEventLoop的啟動

前言 Netty中最核心的就是Reactor執行緒,對應Netty中的程式碼就是NioEventLoop。NioEventLoop是通過NioEventLoopGroup進行維護的,所以在介紹NioEventLoop前我們先介紹一下NioEventLoopGr

Netty原始碼分析之Reactor執行模型

一、背景  最近在研究netty的原始碼,今天發表一篇關於netty的執行緒框架--Reactor執行緒模型,作為最近研究成果。如果有還不瞭解Reactor模型請自行百度,網上有很多關於Reactor模式。  研究netty的時候,先看了下《netty權威指南》,裡面講解不

Netty高效能之Reactor執行模型

Netty是一個高效能、非同步事件驅動的NIO框架,它提供了對TCP、UDP和檔案傳輸的支援,作為一個非同步NIO框架,Netty的所有IO操作都是非同步非阻塞的,通過Future-Listener機

面試官:Netty執行模型可不只是主從多Reactor這麼簡單

筆者看來Netty的核心主要包括如下圖三個部分: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210109203705225.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,te

深入研究Netty執行模型詳解

https://my.oschina.net/7001/blog/1480153 本文主要介紹Netty執行緒模型及其實現,介紹Netty執行緒模型前,首先會介紹下經典的Reactor執行緒模型,目前大多數網路框架都是基於Reactor模式進行設計和開發,Reactor模式基於事件驅動,非常適合

Netty IO執行模型學習總結

Netty框架的 主要執行緒是IO執行緒,執行緒模型的好壞直接決定了系統的吞吐量、併發性和安全性。 Netty的執行緒模型遵循了Reactor的基礎執行緒模型。下面我們先一起看下該模型 Reactor執行緒模型 Reactor 單執行緒模型 單執行緒模型中所有

JavaSocket程式設計之Netty框架執行模型

1.Netty概述     Netty是一個由JBoss提供的高效的Java NIO client-server(客戶端-伺服器)開發框架,使用Netty可以快速開發網路應用。Netty提供了一種新的方式來使開發網路應用程式,使其很容易使用且有很強的可擴充套件性。Netty的內部實現是很複雜的,但是

六、Netty執行模型

Netty框架的主要執行緒就是IO執行緒,執行緒模型設計的好壞,決定了系統的吞吐量、併發性和安全性等架構質量屬性。而討論netty的執行緒模型時,則首先想到經典的Reactor執行緒模型,儘管不同的NIO框架對於Reactor模式的實現存在差異,但本質上還是遵循

netty執行模型, 調優 及 獻上寫過註釋的原始碼工程

Netty能幹什麼? Http伺服器 使用Netty可以編寫一個 Http伺服器, 就像tomcat那樣,能接受使用者傳送的http請求, , 只不過沒有實現Servelt規範, 但是它也能解析攜帶的引數, 對請求的路徑進行路由導航, 從而實現將不同的請求導向不同的handler進行處理 對socket與RP

Reactor執行模型

單執行緒模型(所有的IO操作都由同一個NIO執行緒處理) 原理 上圖,有三個客戶端連線了服務端,在服務端有一個單執行緒。連線都是由這個單執行緒處理的,連線完後需要做一些額外的操作也是由這個單執行緒去處理的。作為服務端,它用於接收客戶端所有的連線。如果作為客戶端,它就會向服務端發起所

執行安全性以及Spring@Controller、@Service的使用

執行緒安全性定義 多個執行緒同時訪問一個類,不論執行時環境怎樣分配排程方法或者這些執行緒如何交替執行類中的方法,並且呼叫該類方法的多執行緒程式碼不進行同步或協同操作,在這種情況下,這個類表現出的行為都是正確一致的,則稱這個執行緒是安全的。 執行緒安全性體

[原創]一款基於Reactor執行模型的java網路爬蟲框架

AJSprider github: https://github.com/zhuchangwu/AJSpider 概述 AJSprider是筆者基於Reactor執行緒模式+Jsoup+HttpClient封裝的一款輕量級java多執行緒網路爬蟲框架,簡單上手,小白也能玩爬蟲, 使用本框架,只需要關注如何

netty學習之Reactor線程模型以及netty應用

rec 直接 滿足 red 轉載 chan tail io處理 理論 轉載:http://blog.csdn.net/u010853261/article/details/55805216 說道netty的線程模型,我們第一反應就是經典的Reactor線程模型,下面我們就

Netty執行模型

1. 背景 1.1. 驚人的效能資料資料分析與企業架構京東618大促下的資料驅動個性化推薦如何構建軟硬體結合的人工智慧產品研發體系中國創新型網際網路企業走向海外的技術機遇與挑戰LinkedIn成員分類平臺大資料應用的最佳實踐1.2. Netty基礎入門2. Net

Netty(EventLoop 和執行模型)

EventLoop介面     Netty的EventLoop是協同設計的一部分,它採用了兩個基本的API:併發和網路程式設計。首先,io.netty.util.concurrent包構建在JDK的java.util.concurrent包上,用來提供執行緒執行

小白帶你認識netty(三)之NioEventLoop的執行(或者reactor執行)啟動(三)

在上一章中,我們看了處理IO事件的過程,今天,我們瞅瞅處理非同步任務佇列。 3、處理非同步任務佇列 在執行完processSelectedKeys方法後,netty會繼續執行runAllTasks方法,在觀摩這個方法之前,我們瞭解下netty的task。 在初始化NioEventLoop的時候,會例

netty原始碼解解析(4.0)-5 執行模型-EventExecutorGroup框架

上一章講了EventExecutorGroup的整體結構和原理,這一章我們來探究一下它的具體實現。 EventExecutorGroup和EventExecutor介面 io.netty.util.concurrent.EventExecutorGroup j

(譯)Netty In Action第七章—事件迴圈和執行模型

請尊重勞動成果,未經本人允許,拒絕轉載,謝謝! 這章包涵以下內容 - 執行緒模型概覽 - 事件迴圈概念和實現 - 任務排程 - 實現細節 簡單地說,執行緒模型指定了OS、程式語言、框架或應用程式的上下文中的執行緒管理的關鍵方面。執行緒創造的方式和時間明顯對於應用程