1. 程式人生 > >六、Netty的執行緒模型

六、Netty的執行緒模型

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

一、Reactor單執行緒模型

Reactor單執行緒模型,是指所有的IO操作都在同一個NIO執行緒上面完成。NIO執行緒的職責如下:
(1)作為NIO服務端,接收客戶端的TCP連線;
(2)作為NIO客戶端,向服務端發起TCP連線;
(3)讀取通訊對端的請求或者應答訊息;
(4)向通訊對端傳送訊息請求或者應答訊息。
這裡寫圖片描述


image
由於Reactor模式使用的是非同步非阻塞IO,所有的IO操作都不會導致阻塞,理論上一個執行緒可以獨立處理所有IO相關的操作。從架構層面看,一個NIO執行緒確實可以完成其承擔的職責。例如,通過Acceptor類接收客戶端的TCP連線請求訊息,當鏈路建立成功之後,通過Dispatch將對應的ByteBuffer派發到指定的Handler上,進行訊息解碼。使用者執行緒訊息編碼後通過NIO執行緒將訊息傳送給客戶端。

在一些小容量應用場景下,可以使用單執行緒模型。但是這對於高負載、大併發的應用場景卻不合適,主要原因如下:
(1)一個NIO執行緒同時處理成百上千的鏈路,效能上無法支撐,即便NIO執行緒的CPU負荷達到了100%,也無法滿足海量訊息的編碼和解碼、讀取和傳送;
(2)當NIO執行緒下執行緒負載過重之後,處理速度將變慢,這會導致大量客戶端連線超時,超時之後往往會進行重發,這更加重了NIO執行緒的負載,最終會導致大量訊息積壓和處理超時,成為系統的效能瓶頸。
(3)可靠性問題:一旦NIO執行緒意外跑飛,或者進入死迴圈,會導致整個系統通訊模組不可用,不能接收和處理外部訊息,造成節點故障。

二、Reactor多執行緒模型

Reactor多執行緒模型與單執行緒模型最大的區別就是有一組NIO執行緒來處理IO操作,原理如下:

Reactor多執行緒模型的特點如下:
(1)有專門一個NIO執行緒—-Acceptor執行緒用於監聽服務端,接收客戶端的TCP連線請求
(2)網路IO操作—-讀、寫等由一個NIO執行緒池負責,執行緒池可以採用標準的JDK執行緒池實現,它包含一個任務佇列和N個可用的執行緒,由這些NIO執行緒負責訊息的讀取、解碼、編碼和傳送。
(3)一個NIO執行緒可以同時處理N條鏈路,但是一個鏈路只對應一個NIO執行緒,防止發生併發操作等問題。
這裡寫圖片描述

在絕大多數場景下,Reactor多執行緒模型可以滿足效能需求,但是,在個別特殊場景中,一個NIO執行緒負責監聽和處理所有的客戶端連線可能會存在效能問題。例如併發百萬客戶端連線,或者服務端需要對客戶端握手進行安全認證,但是認證本身非常損耗效能。在這類場景下,單獨一個Acceptor執行緒可能會存在效能不足的問題,為了解決效能問題,產生了第三種Reactor執行緒模型—-主從Reactor多執行緒模型。

三、主從Reactor模型

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

利用主從NIO執行緒模型,可以解決一個服務端監聽執行緒無法有效處理所有客戶端連線的效能不足問題。因此,在Netty的官方demo中,推薦使用該執行緒模型。

四、Netty的執行緒模型

Netty的執行緒模型並不是一成不變的,它實際取決於使用者的啟動引數配置。通過設定不同的啟動引數,Netty可以同時支援Reactor但單執行緒模型、多執行緒模型和主從Reactor多執行緒模型。
這裡寫圖片描述
image

 // 配置服務端的NIO執行緒組
            EventLoopGroup bossGroup = new NioEventLoopGroup();
            EventLoopGroup workerGroup = new NioEventLoopGroup();
            try {
                ServerBootstrap b = new ServerBootstrap();

                // 設定執行緒組及Socket引數
                b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
                        .option(ChannelOption.SO_BACKLOG, 1024)
                        .childHandler(new ChildChannelHandler());

服務端啟動的時候,建立了兩個NioEventLoopGroup。它們實際是兩個獨立的Reactor執行緒池。一個用於接收客戶端的TCP連線,另一個用於處理IO相關的讀寫操作,或者執行系統Task、定時任務等。

Netty用於接收客戶端請求的執行緒池職責如下:
(1)接收客戶端TCP連線,初始化Channel引數;
(2)將鏈路狀態變更事件通知給ChannelPipeline。
Netty處理IO操作的Reactor執行緒池職責如下:
(1)非同步讀取通訊對端的資料報,傳送讀事件到ChannalPipeline;
(2)非同步傳送訊息到通訊對端,呼叫ChannelPipeline的訊息傳送介面;
(3)執行系統呼叫task;
(4)執行定時任務Task,例如鏈路空閒狀態監測定時任務。

通過調整執行緒池的執行緒個數、是否共享執行緒池等方式,Netty的Reactor模型可以在上述模型中靈活轉換。

為了儘可能的提升效能,Netty在很多地方進行了無鎖化設計,例如在IO執行緒內部進行序列操作,避免多執行緒競爭導致的效能下降問題。表面上看,序列化設計似乎CPU利用率不高,併發程度不夠,但是,通過調整NIO執行緒池的執行緒引數,可以同時啟動多個序列化的執行緒並行執行,這種區域性無鎖化的序列執行緒設計相比一個佇列---多個工作執行緒的模型效能更優。

設計原理如下:
這裡寫圖片描述

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

相關推薦

Java IO模型Netty執行模型

目錄   一、概念介紹 1、同步與非同步 2、阻塞與非阻塞 3、同步阻塞io 4、同步非阻塞io 5、IO多路複用 6、非同步IO 二、BIO(同步阻塞IO) 三、偽非同步IO ​ 四、NIO(同步阻塞IO) 五、Netty執行緒模型

java NIO模擬 Netty執行模型

兩個類,NioAcceptor,處理連線 單執行緒。NioReactor處理讀寫,多執行緒。 解釋放在程式碼中 NioAcceptor package com.zwj.myNio; import java.io.IOException; import java.net

Netty系列三:netty執行模型

netty使用reactor反應堆執行緒模型。 一、Reactor模型單執行緒模型如下: 使用者發起IO操作到事件分離器 事件分離器呼叫相應的處理器處理事件 事件處理完成,事件分離器獲得控制權,繼續相應處理 二、Reactor模型多執行緒模型如下

Netty執行模型(中)

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

netty原始碼分析(十七)Netty執行模型深度解讀與架構設計原則

上次分析到: public abstract class SingleThreadEventLoop extends SingleThreadEventExecutor implements EventLoop public ChannelFutu

netty執行模型

Proactor和Reactor Proactor和Reactor是兩種經典的多路複用I/O模型,主要用於在高併發、高吞吐量的環境中進行I/O處理。 I/O多路複用機制都依賴於一個事件分發器,事件分離器把接收到的客戶事件分發到不同的事件處理器中,如下圖:

Netty執行模型之客戶端執行模型

相比於服務端,客戶端的執行緒模型簡單一些,它的工作原理如下:第一步:由使用者執行緒發起客戶端連線,示例程式碼如下:客戶端只需要建立一個EventLoopGroup,因為它不需要獨立的執行緒去監聽客戶端連

IO網路執行模型總結

摘自網路上看過的文章,處於以不詳~ 一、一些概念 同步:傳送請求,等待返回,然後再發送下一個請求。 非同步:傳送請求,不等待返回,接下來可以處理其他事情,或者隨時傳送下一個請求。 併發:同時處理多個請求 二、執行緒池模型 HS/HA半同步/半非同步模式:分為三層,同步層、

Netty執行模型及EventLoop和EventLoopGroup原始碼解析

 1、netty執行緒模型   一般在討論netty的執行緒模型的時候,我們會考慮到經典的Reactor執行緒模型,下面分別說明下經典的Reactor執行緒模型 1、1 Reactor單執行緒模型      這個執行緒模型指的是所有的nio操作都是在一個執行緒中去完成的。n

Netty執行模型詳解

1. 背景 1.1. Java執行緒模型的演進 1.1.1. 單執行緒 時間回到十幾年前,那時主流的CPU都還是單核(除了商用高效能的小機),CPU的核心頻率是機器最重要的指標之一。 在Java領域當時比較流行的是單執行緒程式設計,對於CPU密集型的應用程式而言,

徹底搞懂 netty 執行模型

編者注:Netty是Java領域有名的開源網路庫,特點是高效能和高擴充套件性,因此很多流行的框架都是基於它來構建的,比如我們熟知的Dubbo、Rocketmq、Hadoop等。本文就netty執行緒模型展開分析討論下 : ) IO模型 BIO:同步阻塞IO模型; NIO:基於IO多路複用技術的“非阻塞同

Netty原始碼死磕一(netty執行模型及EventLoop機制)

## 引言 好久沒有寫部落格了,近期準備把`Netty`原始碼啃一遍。在這之前本想直接看原始碼,但是看到後面發現其實效率不高, 有些概念還是有必要回頭再細啃的,特別是其執行緒模型以及`EventLoop`的概念。 當然在開始之前還是有務必要對`IO模型`要有清晰準確的認識。 傳送門 []() ## 事件

Netty執行模型

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

MinaNettyTwisted一起學(十):執行模型

要想開發一個高效能的TCP伺服器,熟悉所使用框架的執行緒模型非常重要。MINA、Netty、Twisted本身都是高效能的網路框架,如果再搭配上高效率的程式碼,才能實現一個高大上的伺服器。但是如果不瞭解它們的執行緒模型,就很難寫出高效能的程式碼。框架本身效率再高,程式寫的太差

Netty基礎:七EventLoop的執行模型

1.執行緒池概述 執行緒模型確定了程式碼的執行方式。Java 5 隨後引入了ExecutorAPI,其執行緒池通過快取和重用Thread 極大地提高了效能。 執行緒池基礎 >>執行緒池原理 從池的空閒執行緒列表中選擇一個 Thread,並且指

作業系統(6)程序---程序概念:程序控制程序狀態三狀態模型掛起模型執行概念:使用者執行核心執行輕權執行

文章目錄 1:程序相關概念 1. 程序的概念 2. 程序控制塊 3. 程序狀態 4. 三狀態程序模型(就緒、執行、阻塞/等待) 5. 掛起程序模型 2:程序控制

執行多程序之比較,以及三種執行模型

工作幾年找工作幾乎總會被問,從最開始的從網上看答案,到現在憑自己的經驗去說,這個問題似乎也是經驗積累的一個驗證,最近沒事就總結一下吧: 程序和執行緒的定義、比較等: 程序:處於活動狀態的計算機程式。程序就是在作業系統中       執行特定的任務,程序針對

Netty(EventLoop 和執行模型)

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

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

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

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

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