目录

Reactor线程模型

Reactor单线程模型

线程的职责

应用场景

Reactor多线程模型

线程职责

应用场景

主从Reactor多线程模型

Netty模型

Netty单线程模型

Netty多线程模型

Netty主从模型


Reactor线程模型

Reactor单线程模型

Reactor单线程模型,指的是所有的I/O操作都在同一个NIO线程上面完成。

线程的职责

  1. 接收客户端的TCP连接;
  2. 处理I/O操作;

应用场景

用于小场景,高并发,高负载不合适。

Reactor多线程模型

Reactor多线程模型与单线程模型最大区别就是单独有一组NIO线程处理I/O操作

线程职责

主线程负责TCP接收,发送/接收数据。

工作线程负责I/O操作。

1个NIO线程可以同时处理N条链路,但是1个链路只对应1个NIO线程,防止发生并发操作问题。

应用场景

应用于大多数场景。不适用于百万级场景,因为主线程负责所有连接,可能会导致性能问题。

主从Reactor多线程模型

服务端用于接收客户端连接的不再是1个单独的NIO线程,而是一个独立的NIO线程池。由从线程池处理所有Socket连接

Netty模型

Netty单线程模型

public void bind(int port)
 {
     EventLoopGroup reactorGroup = new NioEventLoopGroup();
     try {
         ServerBootstrap b = new ServerBootstrap();

//boss和worker是同一个group。
         b.group(reactorGroup, reactorGroup)
         .channel(NioServerSocketChannel.class)
         .childHandler(new ChannelInitializer<SocketChannel>()
         {
             @Override
             protected void initChannel(SocketChannel ch) throws Exception
             {
                 ch.pipeline().addLast("http-codec", new HttpServerCodec());
                 ch.pipeline().addLast("aggregator", new HttpObjectAggregator(65536));
                 ch.pipeline().addLast("http-chunked", new ChunkedWriteHandler());
                 
             }
         }
         );
         Channel ch = b.bind(port).sync().channel();
         ch.closeFuture().sync();
     }
     catch (InterruptedException e)
     {
        e.printStackTrace();
     }
     finally
     {
        reactorGroup.shutdownGracefully();
     }
 }

Netty多线程模型

public void bind(int port)
 {

//NioEventLoopGroup参数为1,表示仅有1个线程。
        EventLoopGroup acceptorGroup = new NioEventLoopGroup(1);
        NioEventLoopGroup ioGroup = new NioEventLoopGroup();
     try {
         ServerBootstrap b = new ServerBootstrap();

//boss和worker是不同的组
         b.group(acceptorGroup, ioGroup)
         .channel(NioServerSocketChannel.class)
         .childHandler(new ChannelInitializer<SocketChannel>()
         {
             @Override
             protected void initChannel(SocketChannel ch) throws Exception
             {
                 ch.pipeline().addLast("http-codec", new HttpServerCodec());
                 ch.pipeline().addLast("aggregator", new HttpObjectAggregator(65536));
                 ch.pipeline().addLast("http-chunked", new ChunkedWriteHandler());
                 
             }
         }
         );
         Channel ch = b.bind(port).sync().channel();
         ch.closeFuture().sync();
     }
     catch (InterruptedException e)
     {
        e.printStackTrace();
     }
     finally
     {
        reactorGroup.shutdownGracefully();
     }
 }

Netty主从模型

public void bind(int port)
 {

//NioEventLoopGroup参数未设置,表示仅有多个线程(默认:Runtime.getRuntime().availableProcessors())。
        EventLoopGroup acceptorGroup = new NioEventLoopGroup();
        NioEventLoopGroup ioGroup = new NioEventLoopGroup();
     try {
         ServerBootstrap b = new ServerBootstrap();

//boss和worker是不同的组
         b.group(acceptorGroup, ioGroup)
         .channel(NioServerSocketChannel.class)
         .childHandler(new ChannelInitializer<SocketChannel>()
         {
             @Override
             protected void initChannel(SocketChannel ch) throws Exception
             {
                 ch.pipeline().addLast("http-codec", new HttpServerCodec());
                 ch.pipeline().addLast("aggregator", new HttpObjectAggregator(65536));
                 ch.pipeline().addLast("http-chunked", new ChunkedWriteHandler());
                 
             }
         }
         );
         Channel ch = b.bind(port).sync().channel();
         ch.closeFuture().sync();
     }
     catch (InterruptedException e)
     {
        e.printStackTrace();
     }
     finally
     {
        reactorGroup.shutdownGracefully();
     }
 }

Netty默认模式是主从多线程模式,worker没有线程池,由subReactor处理I/O操作,读完已收到的数据到ChannelBuffer中,之后触发ChannelPipeline中的ChannelHandler流。

Netty--Reactor模式相关推荐

  1. 【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )

    文章目录 一. NIO 原生 API 弊端 二. Netty 简介 三. Netty 架构 四. Netty 版本 五. Netty 线程模型 六. 阻塞 IO 线程模型 七. 反应器 ( React ...

  2. Netty出现的原因以及多种Reactor模式

    一.原生NIO存在的问题 NIO的类库与API繁杂,需要熟练掌握Selector.ServerSocketChannel.SocketChannel.Bytebuffer等要求熟悉Java多线程编程和 ...

  3. Netty基础入门——Reactor模式

    文章目录 1. 前言 2. 单线程Reactor模式 3. 多线程Reactor模式 4. Reactor模式和观察者模式 1. 前言 Reactor模式是高性能.高并发技术中非常重要的基础知识,只有 ...

  4. Netty之reactor模式

    Netty之Reactor模式 目录 1. 单线程模型 2. 多线程模型 3. 主从多线程模型 参考资料 正文 无论是C++还是Java编写的网络框架,大多数都是基于Reactor模式进行设计和开发, ...

  5. Netty快速入门与Reactor模式

    Netty概述 原生NIO存在的问题 NIO的类库和API繁杂,使用麻烦:需要熟练掌握Selector.ServerSocketChannel.SocketChannel.ByteBuffer等 需要 ...

  6. 【Netty】反应器 Reactor 模式 ( 单反应器 Reactor 单线程 | 单反应器 Reactor 多线程 )

    文章目录 一. 反应器 ( Reactor ) 模式 二. 反应器 ( Reactor ) 模式两大组件 三. 单反应器 ( Reactor ) 单线程 四. 单反应器 ( Reactor ) 单线程 ...

  7. 高性能IO之Reactor模式

    讲到高性能IO绕不开Reactor模式,它是大多数IO相关组件如Netty.Redis在使用的IO模式,为什么需要这种模式,它是如何设计来解决高性能并发的呢? 最最原始的网络编程思路就是服务器用一个w ...

  8. swing的gui是通过何种模式进行事件响应与监听_【Vert.x准备篇2】C10K问题与Reactor模式...

    C10K问题是1999年一个叫Dan Kegel的美国人提出的概念,其中C为concurrently, 10K指的是1万个网络连接, 结合起来意为如何能够做到并发处理1万个连接. 这里首先要澄清一下, ...

  9. reactor线程模型_简单了解Java Netty Reactor三种线程模型

    1. Reactor三种线程模型 1.1. 单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接 ...

  10. Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式

    本文介绍了Java中的四种I/O模型,同步阻塞,同步非阻塞,多路复用,异步阻塞.同时将NIO和BIO进行了对比,并详细分析了基于NIO的Reactor模式,包括经典单线程模型以及多线程模式和多Reac ...

最新文章

  1. hdu4126(MST + 树形dp
  2. VSCode 启动 Vue 项目 npm install 报错
  3. elementui el-drawer去除自带黑色边框、允许滚动(亲测有效)
  4. linux系统libpcap安装方法
  5. java list 分组_Java 将List中的实体类按照某个字段进行分组并存
  6. python整数池_对Python中小整数对象池和大整数对象池的使用详解
  7. linux禁止内核抢占,Linux内核态抢占机制分析
  8. opencv3.4.1 + vs 2017 + cmake 3.11.3 + win10 配置. 终章
  9. Linux C socket 编程之UDP
  10. 为提升 DCP 传输效率,阿里工程师竟然这样做!
  11. php的登陆代码,PHP登陆页面完整代码
  12. aspose转pdf乱码问题
  13. 股市最好用的大数据软件_十大股票软件排名谁知道?
  14. Autoware(Architecture Proposal)
  15. 概率论与数理统计浙江大学笔记和课后答案
  16. 创业的路,每一天都是劫后余生,怎么走?
  17. MATLAB写UCB算法,科学网—【RL系列】Multi-Armed Bandit问题笔记——UCB策略实现 - 管金昱的博文...
  18. 第②波 | 纯福利,无套路资源分享~
  19. 简单配置Mybatis,Druid访问MySQL数据库
  20. 谷歌浏览器CSND广告屏蔽方法

热门文章

  1. 数字图像处理之空间域图像增强
  2. Windows Phone Developer Tools 下载地址
  3. SQL Server 2005 COM+ 目录要求 (警告)
  4. 闲话WPF之七(XAML的向前兼容性)
  5. Asp.Net iframe Cookie 域 的问题!
  6. java解析xml转为Map
  7. 2018年中国研究生数学建模竞赛--经验贴
  8. 深入理解 Angular 变化检测(change detection)
  9. Linux 实例常用内核网络参数介绍与常见问题处理
  10. 昂贵的聘礼 Dijkstra法