Netty線程模型詳解

一、Netty線程模型圖

Netty是一個非阻塞的、事件驅動的網路應用程序框架。它提供了一個基於NIO的非同步通訊模型,採用了Reactor模式,使用單線程處理器(或少量線程池)來接收和處理所有的事件。下面是Netty線程模型的圖示:

Netty線程模型的特點是:

  1. 僅有一個線程(單線程)處理所有I/O事件。
  2. 事件處理是串列化的,同一時刻只能處理一個事件。
  3. 使用了多個線程池進行業務處理。

二、Netty線程模型有哪些

在Netty的線程模型中,常見的有以下線程池:

  • BOSS線程池: 接收連接到來並註冊每一個新的 Channel。
  • WORKER線程池: 處理業務請求。
  • 業務線程池: 處理業務請求中的耗時操作。
  • 定時器線程池: 處理定時任務。

三、Netty線程模型基於NIO

Netty線程模型基於NIO,因為NIO相對於BIO具有更好的並發性能,適用於高性能、高並發的網路應用。

Netty線程模型中的I/O事件是由Java NIO的Selector處理的。當一個Channel的連接建立成功後,將其註冊到Selector上,Selector會不斷地輪詢已經註冊的Channel,當發現Channel有事件發生時(例如:連接請求、數據到達等),則交給Worker線程池進行處理。

四、Netty線程模型詳解

Netty線程模型詳細解釋如下:

1. Bootstrap類的作用

Bootstrap類是客戶端程序的啟動引導類,用來配置和啟動Netty客戶端程序。其中,BOSS線程池的線程個數通過 bossGroup.option(ChannelOption.SO_BACKLOG, 1024) 方法設置。

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();

try {
    Bootstrap b = new Bootstrap();                    // Bootstrap類
    b.group(bossGroup)                                // Boss線程池
     .channel(NioSocketChannel.class)                 // 設置socket工廠
     .option(ChannelOption.TCP_NODELAY, true)         // 設置TCP參數
     .handler(new ChannelInitializer<SocketChannel>() {
         @Override
         public void initChannel(SocketChannel ch) throws Exception {
             ch.pipeline().addLast(new HelloClientHandler());
         }
     });

    ChannelFuture f = b.connect("127.0.0.1", 8080).sync(); // 連接伺服器
    f.channel().closeFuture().sync();                       // 等待連接關閉
} finally {
    workerGroup.shutdownGracefully();
    bossGroup.shutdownGracefully();
}

2. Boss線程池

Boss線程池接收連接到來並註冊每一個新的 Channel。Boss線程池一般採用單線程模型,這也是為什麼說Netty是一種非阻塞、事件驅動的模型。

3. Worker線程池

Worker線程池處理業務請求,處理業務請求的過程中可能需要耗時操作,可以採用業務線程池進行處理。Worker線程池一般使用多線程模型,線程個數可以通過 workerGroup.option(ChannelOption.SO_KEEPALIVE, true).childOption(ChannelOption.SO_KEEPALIVE, true).option(ChannelOption.SO_BACKLOG, 128) 方法進行設置。

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup(5); // Worker線程池,有5個線程

try {
    ServerBootstrap b = new ServerBootstrap();    // ServerBootstrap類
    b.group(bossGroup, workerGroup)               // Boss和Worker線程池
     .channel(NioServerSocketChannel.class)       // 設置channel工廠
     .option(ChannelOption.SO_BACKLOG, 1024)      // 設置TCP參數
     .childOption(ChannelOption.SO_KEEPALIVE, true)
     .childOption(ChannelOption.TCP_NODELAY, true)
     .childHandler(new ChannelInitializer<SocketChannel>() {// 業務處理類
         @Override
         public void initChannel(SocketChannel ch) throws Exception {
             ch.pipeline().addLast(new ServerHandler());
         }
     });

    ChannelFuture f = b.bind(8080).sync();        // 綁定埠
    f.channel().closeFuture().sync();            // 等待伺服器連接關閉
} finally {
    workerGroup.shutdownGracefully();
    bossGroup.shutdownGracefully();
}

4. 業務線程池

業務線程池處理業務請求中的耗時操作,使得Worker線程能夠快速地處理其他請求。

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup(5);
ExecutorService businessThreadPool = Executors.newFixedThreadPool(10); // 業務線程池

try {
    ServerBootstrap b = new ServerBootstrap();
    b.group(bossGroup, workerGroup)
     .channel(NioServerSocketChannel.class)
     .option(ChannelOption.SO_BACKLOG, 1024)
     .childOption(ChannelOption.SO_KEEPALIVE, true)
     .childOption(ChannelOption.TCP_NODELAY, true)
     .childHandler(new ChannelInitializer<SocketChannel>() {
         @Override
         public void initChannel(SocketChannel ch) throws Exception {
             ch.pipeline().addLast(new ServerHandler(businessThreadPool));
         }
     });

    ChannelFuture f = b.bind(8080).sync();        // 綁定埠
    f.channel().closeFuture().sync();            // 等待伺服器連接關閉
} finally {
    businessThreadPool.shutdown();
    workerGroup.shutdownGracefully();
    bossGroup.shutdownGracefully();
}

5. 定時器線程池

定時器線程池處理定時任務。Netty中的定時任務採用HashedWheelTimer實現。

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup(5);
ExecutorService businessThreadPool = Executors.newFixedThreadPool(10);
HashedWheelTimer timer = new HashedWheelTimer();

try {
    ServerBootstrap b = new ServerBootstrap();
    b.group(bossGroup, workerGroup)
     .channel(NioServerSocketChannel.class)
     .option(ChannelOption.SO_BACKLOG, 1024)
     .childOption(ChannelOption.SO_KEEPALIVE, true)
     .childOption(ChannelOption.TCP_NODELAY, true)
     .childHandler(new ChannelInitializer<SocketChannel>() {
         @Override
         public void initChannel(SocketChannel ch) throws Exception {
             ch.pipeline().addLast(new ServerHandler(businessThreadPool, timer));
         }
     });

    ChannelFuture f = b.bind(8080).sync();        // 綁定埠
    f.channel().closeFuture().sync();            // 等待伺服器連接關閉
} finally {
    timer.stop();
    businessThreadPool.shutdown();
    workerGroup.shutdownGracefully();
    bossGroup.shutdownGracefully();
}

五、Netty線程模型 知乎

Netty線程模型可以參見知乎上的這個問題:https://www.zhihu.com/question/26928320

六、Netty線程模型 -CSDN

Netty線程模型可以參見CSDN博客上的這篇文章:https://blog.csdn.net/Colin_16/article/details/75522154

七、Netty模型

Netty是一個基於NIO的網路框架,適用於開發高性能、高可靠性的網路應用程序。

八、Netty框架幹什麼的

Netty框架提供了一些常用的協議的實現,比如HTTP、WebSocket、FTP等。在實際開發中,可以直接使用Netty提供的協議實現來快速地開發網路應用。

九、Netty框架原理

Netty框架的原理是基於NIO,採用了Reactor模式。使用單線程處理器(或少量線程池)來接收和處理所有的事件。事件處理是串列化的,同一時刻只能處理一個事件。使用了多個線程池進行業務處理。

十、Netty框架是什麼

Netty框架是一個基於Java NIO實現的網路應用框架,具有高性能、高可靠性、高並發性的特點,適用於開發高性能的網路應用。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/238125.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:09
下一篇 2024-12-12 12:09

相關推薦

  • TensorFlow Serving Java:實現開發全功能的模型服務

    TensorFlow Serving Java是作為TensorFlow Serving的Java API,可以輕鬆地將基於TensorFlow模型的服務集成到Java應用程序中。…

    編程 2025-04-29
  • Python訓練模型後如何投入應用

    Python已成為機器學習和深度學習領域中熱門的編程語言之一,在訓練完模型後如何將其投入應用中,是一個重要問題。本文將從多個方面為大家詳細闡述。 一、模型持久化 在應用中使用訓練好…

    編程 2025-04-29
  • ARIMA模型Python應用用法介紹

    ARIMA(自回歸移動平均模型)是一種時序分析常用的模型,廣泛應用於股票、經濟等領域。本文將從多個方面詳細闡述ARIMA模型的Python實現方式。 一、ARIMA模型是什麼? A…

    編程 2025-04-29
  • Python實現一元線性回歸模型

    本文將從多個方面詳細闡述Python實現一元線性回歸模型的代碼。如果你對線性回歸模型有一些了解,對Python語言也有所掌握,那麼本文將對你有所幫助。在開始介紹具體代碼前,讓我們先…

    編程 2025-04-29
  • Python線程等待指南

    本文將從多個方面詳細講解Python線程等待的相關知識。 一、等待線程結束 在多線程編程中,經常需要等待線程執行完畢再進行下一步操作。可以使用join()方法實現等待線程執行完畢再…

    編程 2025-04-29
  • Python兩個線程交替列印1到100

    這篇文章的主題是關於Python多線程的應用。我們將會通過實際的代碼,學習如何使用Python兩個線程交替列印1到100。 一、創建線程 在Python中,我們可以使用Thread…

    編程 2025-04-28
  • VAR模型是用來幹嘛

    VAR(向量自回歸)模型是一種經濟學中的統計模型,用於分析並預測多個變數之間的關係。 一、多變數時間序列分析 VAR模型可以對多個變數的時間序列數據進行分析和建模,通過對變數之間的…

    編程 2025-04-28
  • 如何使用Weka下載模型?

    本文主要介紹如何使用Weka工具下載保存本地機器學習模型。 一、在Weka Explorer中下載模型 在Weka Explorer中選擇需要的分類器(Classifier),使用…

    編程 2025-04-28
  • ROS線程發布消息異常解決方法

    針對ROS線程發布消息異常問題,我們可以從以下幾個方面進行分析和解決。 一、檢查ROS代碼是否正確 首先,我們需要檢查ROS代碼是否正確。可能會出現的問題包括: 是否正確初始化RO…

    編程 2025-04-28
  • Python實現BP神經網路預測模型

    BP神經網路在許多領域都有著廣泛的應用,如數據挖掘、預測分析等等。而Python的科學計算庫和機器學習庫也提供了很多的方法來實現BP神經網路的構建和使用,本篇文章將詳細介紹在Pyt…

    編程 2025-04-28

發表回復

登錄後才能評論