Netty--Reactor模式
目录
Reactor线程模型
Reactor单线程模型
线程的职责
应用场景
Reactor多线程模型
线程职责
应用场景
主从Reactor多线程模型
Netty模型
Netty单线程模型
Netty多线程模型
Netty主从模型
Reactor线程模型
Reactor单线程模型
Reactor单线程模型,指的是所有的I/O操作都在同一个NIO线程上面完成。
线程的职责
- 接收客户端的TCP连接;
- 处理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模式相关推荐
- 【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )
文章目录 一. NIO 原生 API 弊端 二. Netty 简介 三. Netty 架构 四. Netty 版本 五. Netty 线程模型 六. 阻塞 IO 线程模型 七. 反应器 ( React ...
- Netty出现的原因以及多种Reactor模式
一.原生NIO存在的问题 NIO的类库与API繁杂,需要熟练掌握Selector.ServerSocketChannel.SocketChannel.Bytebuffer等要求熟悉Java多线程编程和 ...
- Netty基础入门——Reactor模式
文章目录 1. 前言 2. 单线程Reactor模式 3. 多线程Reactor模式 4. Reactor模式和观察者模式 1. 前言 Reactor模式是高性能.高并发技术中非常重要的基础知识,只有 ...
- Netty之reactor模式
Netty之Reactor模式 目录 1. 单线程模型 2. 多线程模型 3. 主从多线程模型 参考资料 正文 无论是C++还是Java编写的网络框架,大多数都是基于Reactor模式进行设计和开发, ...
- Netty快速入门与Reactor模式
Netty概述 原生NIO存在的问题 NIO的类库和API繁杂,使用麻烦:需要熟练掌握Selector.ServerSocketChannel.SocketChannel.ByteBuffer等 需要 ...
- 【Netty】反应器 Reactor 模式 ( 单反应器 Reactor 单线程 | 单反应器 Reactor 多线程 )
文章目录 一. 反应器 ( Reactor ) 模式 二. 反应器 ( Reactor ) 模式两大组件 三. 单反应器 ( Reactor ) 单线程 四. 单反应器 ( Reactor ) 单线程 ...
- 高性能IO之Reactor模式
讲到高性能IO绕不开Reactor模式,它是大多数IO相关组件如Netty.Redis在使用的IO模式,为什么需要这种模式,它是如何设计来解决高性能并发的呢? 最最原始的网络编程思路就是服务器用一个w ...
- swing的gui是通过何种模式进行事件响应与监听_【Vert.x准备篇2】C10K问题与Reactor模式...
C10K问题是1999年一个叫Dan Kegel的美国人提出的概念,其中C为concurrently, 10K指的是1万个网络连接, 结合起来意为如何能够做到并发处理1万个连接. 这里首先要澄清一下, ...
- reactor线程模型_简单了解Java Netty Reactor三种线程模型
1. Reactor三种线程模型 1.1. 单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接 ...
- Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式
本文介绍了Java中的四种I/O模型,同步阻塞,同步非阻塞,多路复用,异步阻塞.同时将NIO和BIO进行了对比,并详细分析了基于NIO的Reactor模式,包括经典单线程模型以及多线程模式和多Reac ...
最新文章
- hdu4126(MST + 树形dp
- VSCode 启动 Vue 项目 npm install 报错
- elementui el-drawer去除自带黑色边框、允许滚动(亲测有效)
- linux系统libpcap安装方法
- java list 分组_Java 将List中的实体类按照某个字段进行分组并存
- python整数池_对Python中小整数对象池和大整数对象池的使用详解
- linux禁止内核抢占,Linux内核态抢占机制分析
- opencv3.4.1 + vs 2017 + cmake 3.11.3 + win10 配置. 终章
- Linux C socket 编程之UDP
- 为提升 DCP 传输效率,阿里工程师竟然这样做!
- php的登陆代码,PHP登陆页面完整代码
- aspose转pdf乱码问题
- 股市最好用的大数据软件_十大股票软件排名谁知道?
- Autoware(Architecture Proposal)
- 概率论与数理统计浙江大学笔记和课后答案
- 创业的路,每一天都是劫后余生,怎么走?
- MATLAB写UCB算法,科学网—【RL系列】Multi-Armed Bandit问题笔记——UCB策略实现 - 管金昱的博文...
- 第②波 | 纯福利,无套路资源分享~
- 简单配置Mybatis,Druid访问MySQL数据库
- 谷歌浏览器CSND广告屏蔽方法