一文弄懂-《Scalable IO In Java》
目录
一. 《Scalable IO In Java》 是什么?
二. IO架构的演变历程
1. Classic Service Designs 经典服务模型
2. Event-driven Designs 事件驱动模型
3. Basic Reactor Design 最基本的响应设计
4. Worker Thread Pools:工作线程池模型
5. Using Multiple Reactors:多响应器模型
6. 文档后面讲解的buffer ByteBuffer channel Selector SelectionKey 其实就是整个NIO或者Netty 设计的核心
一. 《Scalable IO In Java》 是什么?
《Scalable IO In Java》 是java.util.concurrent包的作者,java界大师Doug Lea , 这是一篇关于分析和构建高性能的IO架构的文章。Netty/Mina 等高性能IO框架使用这种基于Reactor响应编程的框架,读懂这篇文档,有助于Netty/Mina服务框架的编程思想与设计模式
二. IO架构的演变历程
1. Classic Service Designs 经典服务模型
这个架构图其实和我上一篇文章《一文弄懂-BIO,NIO,AIO》中讲到的 BIO 同步阻塞IO模式是一样的, 每个客户端去请求服务端,服务端进行一些读写等事件的操作,然后将结果同步返回给客户端
2. Event-driven Designs 事件驱动模型
这个图可以联想到我们最初学习java的使用 用AWT开发界面,让然后为界面的每一个button绑定一个事件,这个想必学习java的同学都做过,之前我们在学校做的课程设计就是一个图书管理系统,那个就是用原生的AWT进行开发的,当点击某一个button的时候就会触发事件的执行,底层其实就是如图那样 有一个AWT线程监听的事件的发生
3. Basic Reactor Design 最基本的响应设计
这个其实就是对应着我们java中的 NIO 编程,Reactor对应着java中的selector多路复用器 dispatch其实就是对应SelectionKey,客户端对服务发送的所有事件 都会放到Selector中 然后它根据不同的事件SelectionKey 进行做相应的处理 比如 read decode encode 操作
这里的acceptor相当于单独拿出一个线程来处理连接事件,一般连接事件比较少 所以连接事件和其他事件分为两个线程去实现
4. Worker Thread Pools:工作线程池模型
上面的一种设计 还有改进的地方 就是一般非连接事件会很频繁 有可能一个线程也处理不过来,那么我们在这里可以引入线程池,如下图
这个就是一个工作线程池的图例,专门启动一个线程池去处理Reactor(Selector) 丢过来事件
5. Using Multiple Reactors:多响应器模型
相当于上面的那种架构 连接事件和其他事件 都要经过同一个Reactor, 那么为了减轻Reactor的压力 出现了下面的这种架构
我们主Reactor只处理连接事件 子Reactor来处理其他事件
6. 文档后面讲解的buffer ByteBuffer channel Selector SelectionKey 其实就是整个NIO或者Netty 设计的核心
一文弄懂-《Scalable IO In Java》相关推荐
- deque stack java_一文弄懂java中的Queue家族
简介 java中Collection集合有三大家族List,Set和Queue.当然Map也算是一种集合类,但Map并不继承Collection接口. List,Set在我们的工作中会经常使用,通常用 ...
- 一文弄懂EnumMap和EnumSet
文章目录 简介 EnumMap 什么时候使用EnumMap EnumSet 总结 一文弄懂EnumMap和EnumSet 简介 一般来说我们会选择使用HashMap来存储key-value格式的数据, ...
- 面试必问:一文弄懂MySQL数据库索引之底层数据结构和索引类型
面试必问:一文弄懂MySQL数据库索引之底层数据结构和索引类型 前言 一.索引 1.1作用 1.2特点 1.3使用 1.3.1创建索引 1.3.2删除索引 1.3.3查看表中的索引 1.3.4查看SQ ...
- 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述
<繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...
- 一文弄懂String的所有小秘密
文章目录 简介 String是不可变的 传值还是传引用 substring() 导致的内存泄露 总结 一文弄懂String的所有小秘密 简介 String是java中非常常用的一个对象类型.可以说ja ...
- 并发、并行、同步、异步、进程,线程、串行、并行?一文弄懂八大概念
并发.并行.同步.异步.进程,线程.串行.并行?一文弄懂八大概念 参考博文:并发.并行.串行.同步.异步的区别? java多线程详解(并发,并行,同步) 文章目录 并发.并行.同步.异步.进程,线程. ...
- Scalable IO in Java
Scalable IO in Java http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf 大部分IO都是下面这个步骤, Most have same basi ...
- 一文弄懂神经网络中的反向传播法
最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...
- 一文弄懂各种loss function
有模型就要定义损失函数(又叫目标函数),没有损失函数,模型就失去了优化的方向.大家往往接触的损失函数比较少,比如回归就是MSE,MAE,分类就是log loss,交叉熵.在各个模型中,目标函数往往都是 ...
最新文章
- 计量注册师考试一些关于期限、时间、机构的总结
- Linux学习--目录结构
- 关于页面莫名空白的解决方式
- LeetCode 1166. 设计文件系统(哈希map)
- ubuntu自定义安装里怎么选_中央空调到底应该怎么选?小户型也能安装中央空调?行家说实话了...
- Python获取电脑硬件配置的封装类,可以获取CPU序列号、主板序列号、BIOS序列号、硬盘序列号和网卡MAC地址
- hdu1141 Factstone Benchmark(利用对数进行大数比较)
- web前端基础之JS
- Pandas DataFrame loc []访问一组行和列
- 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询
- mybatis Example常用方法
- tampermonkey 下载
- poi完成word、excel、pdf添加斜体水印
- Axure 安装教程
- linux查找文件中的字符串
- php选择手机相片,头像直接从手机图库选择或者拍照上传
- SSM项目图书馆管理系统,适合新人练手和毕设参考,功能首页展示 系统注册登录登出 用户管理 权限控制管理 书籍管理 图书借阅管理 个人借阅记录管理 书籍详细信息展示等
- ZPO006采购单收货报表
- 英文连写字体怎么练_一篇文章教孩子学会衡水英文字体,建议收藏!
- 懂得选择,学会放弃!