自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

滴滴面試:談?wù)剬etty線程模型的理解?

開發(fā) 架構(gòu)
Netty 線程模型被稱為 Reactor(響應(yīng)式)模型/模式,它是基于 NIO 多路復(fù)用模型的一種升級,它的核心思想是將 IO 事件和業(yè)務(wù)處理進(jìn)行分離,使用一個(gè)或多個(gè)線程來執(zhí)行任務(wù)的一種機(jī)制。

Netty 線程模型是指 Netty 框架為了提供高性能、高并發(fā)的網(wǎng)絡(luò)通信,而設(shè)計(jì)的管理和利用線程的策略和機(jī)制。

Netty 線程模型被稱為 Reactor(響應(yīng)式)模型/模式,它是基于 NIO 多路復(fù)用模型的一種升級,它的核心思想是將 IO 事件和業(yè)務(wù)處理進(jìn)行分離,使用一個(gè)或多個(gè)線程來執(zhí)行任務(wù)的一種機(jī)制。

1.Reactor三大組件

Reactor 包含以下三大組件:

其中:

  • Reactor(反應(yīng)器):Reactor 負(fù)責(zé)監(jiān)聽和分發(fā)事件,它是整個(gè) Reactor 模型的調(diào)度中心。Reactor 監(jiān)視一個(gè)或多個(gè)輸入通道,如監(jiān)聽套接字上的連接請求或讀寫事件。當(dāng)檢測到事件發(fā)生時(shí),Reactor 會將其分發(fā)給預(yù)先注冊的處理器(Handler)進(jìn)行處理。在 Netty 中,這個(gè)角色經(jīng)常是由 EventLoop 或其相關(guān)的 EventLoopGroup 來扮演,它們負(fù)責(zé)事件的循環(huán)處理、任務(wù)調(diào)度和 I/O 操作。
  • Acceptor(接收器):用于處理 IO 連接請求。當(dāng) Reactor 檢測到有新的客戶端連接請求時(shí),會通知 Acceptor,后者通過 accept() 方法接受連接請求,并創(chuàng)建一個(gè)新的 SocketChannel(在 Netty 中是 Channel)來表示這個(gè)連接。隨后,Acceptor 通常會將這個(gè)新連接的 Channel 注冊到 Worker Reactor 或 EventLoop 中,以便進(jìn)一步處理該連接上的讀寫事件。
  • Handlers(處理器):Handlers 負(fù)責(zé)具體的事件處理邏輯,即執(zhí)行與事件相關(guān)的業(yè)務(wù)操作。在 Netty 中,Handler 是一個(gè)或多個(gè) ChannelHandler 的實(shí)例,它們形成一個(gè)責(zé)任鏈(ChannelPipeline),每個(gè) Handler 負(fù)責(zé)處理一種或一類特定的事件(如解碼、編碼、業(yè)務(wù)邏輯處理等)。數(shù)據(jù)或事件在 ChannelPipeline 中從一個(gè) Handler 傳遞到下一個(gè),直至處理完畢或被消費(fèi)。Handler 可以分為入站(inbound)和出站(outbound)兩種,分別處理流入的數(shù)據(jù)或流出的數(shù)據(jù)。

2.Reactor三大模型

Reactor 模式支持以下三大模型:

  • 單線程模型
  • 多線程模型
  • 主從多線程模型

具體內(nèi)容如下。

(1)單線程模型

在單線程模型中,所有的事件處理操作都由單個(gè) Reactor 實(shí)例在單個(gè)線程下完成。Reactor 負(fù)責(zé)監(jiān)控事件、分發(fā)事件和執(zhí)行事件處理程序(Handlers),如下圖所示:

單線程模型的實(shí)現(xiàn) Demo 如下:

// 假設(shè)有一個(gè)單線程的Reactor,負(fù)責(zé)監(jiān)聽、接收連接、讀寫操作
class SingleThreadReactor {
    EventLoop eventLoop; // 單個(gè)事件循環(huán)線程
    
    SingleThreadReactor() {
        eventLoop = new EventLoop(); // 初始化單個(gè)事件循環(huán)
    }
    
    void start(int port) {
        ServerSocketChannel serverSocket = ServerSocketChannel.open();
        serverSocket.socket().bind(new InetSocketAddress(port)); // 綁定端口
        
        eventLoop.execute(() -> { // 在事件循環(huán)中執(zhí)行
            while (true) {
                SocketChannel clientSocket = serverSocket.accept(); // 接受連接
                if (clientSocket != null) {
                    handleConnection(clientSocket); // 處理連接
                }
            }
        });
        eventLoop.run(); // 啟動事件循環(huán)
    }
    
    void handleConnection(SocketChannel clientSocket) {
        // 讀寫操作,這里簡化處理
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        while (clientSocket.read(buffer) > 0) {
            // 處理讀取的數(shù)據(jù)
            buffer.flip();
            // 假設(shè)處理數(shù)據(jù)邏輯...
            buffer.clear();
        }
        // 寫操作邏輯類似
    }
}

優(yōu)缺點(diǎn)分析

  • 優(yōu)點(diǎn):簡單、線程安全性好、適合編寫簡單的網(wǎng)絡(luò)應(yīng)用。
  • 缺點(diǎn):處理能力受限于單個(gè)線程的處理能力,無法充分利用多核 CPU,可能會影響性能。

(2)多線程模型

在多線程模型中,連接 Acceptor 和業(yè)務(wù)處理(Handlers)是由不同線程分開執(zhí)行的,其中 Handlers 是由線程池(多個(gè)線程)來執(zhí)行的,如下圖所示:

多線程模型的實(shí)現(xiàn) Demo 如下:

// 假設(shè)有兩個(gè)線程,一個(gè)用于監(jiān)聽連接,一個(gè)用于處理連接后的操作
class MultiThreadReactor {
    EventLoop acceptLoop;
    EventLoop workerLoop;
    
    MultiThreadReactor() {
        acceptLoop = new EventLoop(); // 接收連接的線程
        workerLoop = new EventLoop(); // 處理連接的線程
    }
    
    void start(int port) {
        ServerSocketChannel serverSocket = ServerSocketChannel.open();
        serverSocket.socket().bind(new InetSocketAddress(port));
        
        acceptLoop.execute(() -> { // 在接受線程中監(jiān)聽
            while (true) {
                SocketChannel clientSocket = serverSocket.accept();
                if (clientSocket != null) {
                    workerLoop.execute(() -> handleConnection(clientSocket)); // 將新連接交給工作線程處理
                }
            }
        });
        
        acceptLoop.run(); // 啟動接受線程
        workerLoop.run(); // 啟動工作線程
    }
    
    // handleConnection 方法與單線程模型中的相同
}

優(yōu)缺點(diǎn)分析

  • 優(yōu)點(diǎn):此模式可以提高并發(fā)性能,充分利用多核 CPU,并且保持簡單的編程模型。
  • 缺點(diǎn):多線程數(shù)據(jù)共享和數(shù)據(jù)同步比較復(fù)雜,并且 Reactor 需要處理所有事件監(jiān)聽和響應(yīng),在高并發(fā)場景依然會出現(xiàn)性能瓶頸。

(3)主從多線程模型

主從多線程模型是一個(gè)主 Reactor 線程加多個(gè)子 Reactor 子線程,以及多個(gè)工作線程池來處理業(yè)務(wù)的,如下圖所示:

主從多線程模型的實(shí)現(xiàn) Demo 如下:

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class MainReactorModel {
    public static void main(String[] args) {
        // 主Reactor,用于接受連接
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        // 從Reactor,用于處理連接后的讀寫操作
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap bootstrap = new ServerBootstrap();
            bootstrap.group(bossGroup, workerGroup)
                     .channel(NioServerSocketChannel.class)
                     .childHandler(new ChannelInitializer<SocketChannel>() {
                         @Override
                         protected void initChannel(SocketChannel ch) {
                             // 在這里添加業(yè)務(wù)處理器,如解碼器、編碼器、業(yè)務(wù)邏輯處理器
                             ch.pipeline().addLast(new MyBusinessHandler());
                         }
                     });

            ChannelFuture future = bootstrap.bind(8080).sync();
            System.out.println("Server started at port 8080");
            future.channel().closeFuture().sync(); // 等待服務(wù)器關(guān)閉
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

優(yōu)缺點(diǎn)分析

  • 優(yōu)點(diǎn):可以充分利用多核 CPU 的資源,提高系統(tǒng)的整體性能和并發(fā)處理能力。
  • 缺點(diǎn):模型相對復(fù)雜,實(shí)現(xiàn)和維護(hù)成本較高。
責(zé)任編輯:姜華 來源: Java中文社群
相關(guān)推薦

2025-02-21 15:25:54

虛擬線程輕量級

2025-03-21 00:00:05

Reactor設(shè)計(jì)模式I/O 機(jī)制

2024-06-13 08:01:19

2022-09-06 11:13:16

接口PipelineHandler

2024-09-27 15:43:52

零拷貝DMAIO

2024-10-24 16:14:43

數(shù)據(jù)傳輸CPU零拷貝

2022-03-21 09:05:18

volatileCPUJava

2022-06-30 09:10:33

NoSQLHBaseRedis

2023-11-28 12:25:02

多線程安全

2024-08-27 12:36:33

2019-07-26 06:42:28

PG架構(gòu)數(shù)據(jù)庫

2024-10-12 16:25:12

2021-11-05 10:07:13

Redis哈希表存儲

2024-09-26 16:01:52

2024-08-26 14:52:58

JavaScript循環(huán)機(jī)制

2022-08-29 16:03:33

狀態(tài)流轉(zhuǎn)Java

2025-04-01 12:00:00

gRPC分布式系微服務(wù)

2024-09-20 05:46:00

2024-09-11 16:49:55

2017-06-02 09:47:29

網(wǎng)絡(luò)分層協(xié)議
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號