Netty 线程模型
一、线程模型概述
线程模型表明了代码的执行方式。从最开始的使用单线程,后来出现了多线程,之后是线程池。当有要执行的任务时,任务会被传到线程池,从线程池中获得空闲的线程来执行任务,执行完了后会将线程返回到线程池。
二、Reactor 模型
1.网络服务基本的步骤:
①读取请求 → ②解码请求 → ③处理请求 → ④编码响应 → ⑤发送响应
2.Reactor模型
(1)single threaded version

(图片摘自Doug Lea的pdf,链接参见文末)
在这个模型中,一个线程处理所有I/O相关的操作。acceptor接收来自客户端的TCP连接请求,建立连接后,通过dispatcher将消息(ByteBuffer)分发到各个handler(新的线程)上进行处理。这个模型无法满足高容量的需求,不停的穿建了新的线程来处理消息,耗尽系统资源。此外,当NIO线程负载较重之后,处理速度会变慢导致大量客户端连接超时,重新发送请求,导致CPU很快便会达到100。
(2)Multithreaded pattern

(图片摘自Doug Lea的pdf,链接参见文末)
这个版本上的变化,主要体现在分发到各个handler(worker thread)时,使用了线程池,这样避免创建过多的线程,控制线程数量,提高处理效率。 但是在个别场合,一个NIO线程负责监听和处理所有客户端连接(例如百万客户端连接)可能会存在性能问题。
(3)Multiple Reactor

(图片摘自Doug Lea的pdf,链接参见文末)
在这个模型中,主reactor选择一个线程作为acceptor线程,用于绑定监听端口,接收客户端连接。然后,Acceptor接收客户端请求后创建新的SocketChannel,注册到子reactor中进行握手等操作。最后,来到工作线程池,进行业务的操作。
三、Netty线程模型
1.接口EventLoop
public interface EventLoop extends OrderedEventExecutor, EventLoopGroup {
@Override
EventLoopGroup parent(); // 这个方法,返回这个EventLoop所属的EventLoopGroup的引用
}
在Netty中,多个EventLoop会被创建。其中的一个用来服务多个Channnel,另外的其他,会用来优化资源的使用。这句话的意思,联想代码部分,我们可以想到下面:
EventLoopGroup bossGroup = new NioEventLoopGroup(1); //负责监听接口,处理客户端过来的连接请求
EventLoopGroup workerGroup = new NioEventLoopGroup(); //负责连接之后,通道的信息的传输
再看一下他的类的层次图(图摘自《Netty in action》):

2.Netty 4中I/O 和 事件处理
事件多种多样,事件的本性决定了它本身如何被处理,例如:它可以从网络往应用里传输,也可相反,或是完全不同的一些事件。但是事件的处理逻辑要广泛和灵活,以至于可以处理任何的情况。因此,在Netty 4中所有I/O和事件的处理交给 指定到EventLoop上的thread来执行。这点与Netty 3不同。
3.Netty 3中I/O 和 事件处理
只有Inbound事件会被交给EventLoop来执行,而所有Outbound事件会由调用者线程来执行,可能是I/O线程,也可能是其他线程。因此,outbound端需要同步的操作。因为,五法保证多个线程不会同时操作outbound事件。
4.实现的细节
看下面流程,线程的管理:

任务执行前会进行判断,调用的线程是否是指定给EventLoop的线程。如果是同一个的话,直接执行任务;如果不是,将任务放进队列之中,等EventLoop再次处理它的任务。
这就解释了为什么在ChannelHandler中为什么不需要同步就可以让线程和Channel直接交互。
就写到这里了。。。能力一般,水平有限!希望以后多用到Netty,能更好的认知Netty。
参考资料:
http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf
《Netty in action》
Netty 线程模型的更多相关文章
- eventloop & actor模式 & Java线程模型演进 & Netty线程模型 总结
eventloop的基本概念可以参考:http://www.ruanyifeng.com/blog/2013/10/event_loop.html Eventloop指的是独立于主线程的一条线程,专门 ...
- Netty线程模型
一.Reactor模型 1.单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接: 2)作为NI ...
- Netty系列之Netty线程模型
Reference: http://www.infoq.com/cn/articles/netty-threading-model 1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 ...
- 彻底搞懂 netty 线程模型
编者注:Netty是Java领域有名的开源网络库,特点是高性能和高扩展性,因此很多流行的框架都是基于它来构建的,比如我们熟知的Dubbo.Rocketmq.Hadoop等.本文就netty线程模型展开 ...
- Netty源码死磕一(netty线程模型及EventLoop机制)
引言 好久没有写博客了,近期准备把Netty源码啃一遍.在这之前本想直接看源码,但是看到后面发现其实效率不高, 有些概念还是有必要回头再细啃的,特别是其线程模型以及EventLoop的概念. 当然在开 ...
- Java后端进阶-网络编程(Netty线程模型)
前言 我们在使用Netty进行服务端开发的时候,一般来说会定义两个NioEventLoopGroup线程池,一个"bossGroup"线程池去负责处理客户端连接,一个"w ...
- Reactor三种线程模型与Netty线程模型
文中所讲基本都是以非阻塞IO.异步IO为基础.对于阻塞式IO,下面的编程模型几乎都不适用 Reactor三种线程模型 单线程模型 单个线程以非阻塞IO或事件IO处理所有IO事件,包括连接.读.写.异常 ...
- Netty核心概念(8)之Netty线程模型
1.前言 第7节初步学习了一下Java原本的线程池是如何工作的,以及Future的为什么能够达到其效果,这些知识对于理解本章有很大的帮助,不了解的可以先看上一节. Netty为什么会高效?回答就是良好 ...
- Netty源码学习(一)Netty线程模型
给你一台4路E7-4820V2(32核心64线程),512G内存的服务器,你该如何编程才能支持百万长连接? 最直接的想法是采用BIO的模式,为每个连接新建一个线程,在一一对应的线程中直接处理连接上的数 ...
随机推荐
- 开发工具IntelliJ IDEA的安装与操作
开发工具IntelliJ IDEA的安装与操作 1.1 开发工具概述 IDEA是一个专门针对Java的集成开发工具(IDE),它可以极大地提升我们的开发效率.可以自动编译,检查错误.在公司中,使用的就 ...
- 转载, sublime text3 input函数无法执行问题解决方法
一.安装插件SublimeREPL 按Ctrl+Shift+P,打开命令框.输入Install Package,回车,等待几秒钟,会弹窗提示“安装成功”. 按Ctrl+Shift+P,打开命令框 ...
- python 全栈开发笔记 3
正则表达式 正则表达式(RE)是一种小型的,高度专业化的,它镶嵌在python中,并通过re模块实现,正则表达式编译成一系列的字节码,然后由用c编写的匹配引擎执行. #正则表达式 import re ...
- Java NIO学习之Buffer
Bufer的capacity,position和limit: capacity: 表示buffer的容量. position: 写数据到Buffer中时: 表示当前的位置.初始的position值为0 ...
- DevExpress v18.2新版亮点——DevExtreme篇(一)
行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExtreme Complete Sub ...
- 自动化运维之ansible
第三十九课 自动化运维之ansible 目录 十五. ansible介绍 十六. ansible安装 十七. ansible远程执行命令 十八. ansible拷贝文件或目录 十九. ansible远 ...
- Problem C: STL——Jerry的问题
Description 最近Jerry正在刻苦的学习STL中的set的功能函数,他发现set可以用现有的函数实现并.交.差.对称差等功能,但是他没有找到怎么来比较两个集合是否相等的功能函数,所以他想自 ...
- 新版ios证书的申请
现在IOS不再开放提供测试证书了,整理一个申请证书的流程. 1. 申请应用的id 链接地址 https://developer.apple.com/登陆开发者中心,在account界面点击红框里面得区 ...
- ASP.NET Core2.2 多用户验证和授权
asp.net core2.2 用户验证 和授权有很详细和特贴心的介绍,我感兴趣的主要是这两篇: cookie身份验证 基于角色的授权 我的项目有两类用户: 微信公众号用户,用户名为公众号的openi ...
- Vue语法学习第四课(2)——class与style的绑定
之前学到的指令 v-bind 在用于绑定class和style时,表达式结果可以是字符串.数组.对象. 一.绑定HTMLClass ① 对象语法 <div class="static& ...