Netty In Action 读书笔记 - 第一章 Netty和Java NIO API
来源:互联网 发布:excel2007统计重复数据 编辑:程序博客网 时间:2024/05/11 21:26
Netty In Action读书笔记,多半是翻译……,会尽量加上自己的理解,如有不对请指出。
本章包括:
1、Netty架构
2、为什么我们需要非阻塞IO(NIO)
3、阻塞与非阻塞IO对比
4、已知的JDK NIO实现问题和Netty的解决方案
为什么选择Netty
Netty提供给开发者一整套的工具:
设计:
为不同的传输类型提供统一的API,阻塞或非阻塞Socket;灵活使用;简单但是强大的线程模型;真正的无连接数据包套接字支持;逻辑链使得重用更加容易;
易用:
编排良好的JavaDoc,及大量的使用实例;不依赖除JDK1.6(及以上)以外的任何库,有些特性仅在Java1.7环境下支持,另外一些特性可能有其他依赖,但它们是可选的;
性能:
比Java核心APIs有着更好的吞吐量,和更低的延迟;通过池化和重用,降低资源消耗;最小化不必要的内存拷贝;
健壮性:
不会再因过快、过慢,或过载的连接,产生OutOfMemory异常;不再有NIO应用在高速网络处理环境下经常出现的读/写率不公平的情况;
安全:
完整支持SSL/TLS和StartTLS;可运行在Applet或OSGI这样受限的环境下;
社区:
发布快速,迭代迅速;活跃度高;
异步设计
整个Netty API都是异步的。异步设计思想已经存在一段时间了,由于IO经常是瓶颈,在等待IO时,异步处理鼓励我们以更加有效的方式使用系统资源:开始一个任务并且在任务结束时得到通知,而不是等待它直到完成。在任务执行时,我们可以做其他的事情。
下面介绍两种异步处理设计API并比较技术上的异同:
1、Callbacks
常被用在异步处理中,一个Callback被传递给方法,并在方法完成之后执行。
2、Futures
Future是一种抽象,代表了在某个时间变得可用的值。一个Future对象要么持有运算的结果,要么持有引起运算失败的异常;
JVM中的阻塞与非阻塞IO对比
使用Java完成网络编程任务,通常有两种方式:
-使用IO,也称作阻塞IO;
-使用NIO,也称作非阻塞IO;
阻塞IO使用单一线程处理一个连接,连接和线程数是1:1的,因此受限于JVM所能创建的线程数。
非阻塞IO使用Selector来处理多个连接。
非阻塞IO基础概念
ByteBuffer
可在堆上分配,也可直接分配(使用堆外内存)。通常在将buffer传输至channel时,直接分配的方式会快一些,但是内存分配/回收的代价比较高;Slicing创建一个新的ByteBuffer与原有的ByteBuffer共享数据,但是仅暴露数据的一部分子集,此方法可减少内存拷贝;
Selectors
Channnel代表了到一个可以执行IO操作的实体的连接,如文件或套接字;
Selector是一个NIO组件,用来决策一个或多个channels是否已经准备好读/写,因此,一个selector可以被用来处理多个连接。
NIO存在的问题及Netty的解决办法
跨平台及兼容性问题 - IO依赖底层操作系统,NIO很可能会存在问题(大段/小段等);
继承ByteBuffer - 无法继承(private构造函数),操作不易;
Scattering和Gathering可能导致内存泄漏;
EpollBug - 在Linux内核的操作系统上,selector使用epoll作为IO事件提醒机制。这是一种操作系统与网络栈异步协作的高性能技术。不幸的是,epoll可能导致selector状态异常,和cpu100占用。此时selector不再阻塞而是直接返回,这违反了JavaDoc中的约定。
0 0
- Netty In Action 读书笔记 - 第一章 Netty和Java NIO API
- netty in action 翻译 第一章 netty和java nio API
- Netty In Action中文版 - 第一章:Netty介绍
- Netty In Action中文版 - 第一章:Netty介绍
- netty in action第一章netty介绍
- 《Netty in action 中文》 第一章
- 《netty in action》读书笔记一
- 《Netty in Action V5》-- 第1章 Netty与Java NIO APIS
- Netty4实战第一章:Netty和Java NIO APIs
- Netty in Action 翻译(第一章)
- 学习Netty in action第一章心得
- Netty In Action 读书笔记 - 第八章 内置ChannelHandlers和Codecs
- Netty In Action 读书笔记 - 第二章 第一个Netty应用
- Netty In Action 读书笔记 - 第三章 分解Netty
- Netty In Action 读书笔记 - 第九章 引导启动Netty应用
- Netty In Action 读书笔记 - 第四章 传输
- Netty In Action 读书笔记 - 第五章 Buffer
- Netty In Action 读书笔记 - 第六章 ChannelHandler
- PHP脚本报表控件Stimulsoft Reports.Fx for PHP
- OpenDaylight学习笔记
- 【Unity3D自学记录】脚本中Start()和Awake()的区别
- greeksforgreeks上一个题解释new的时候编译器都会做什么
- 常见的 .htaccess 使用技巧
- Netty In Action 读书笔记 - 第一章 Netty和Java NIO API
- 关于android service有可能被系统杀死的问题。
- 修改注册表QSettings
- 在Eclipse/MyEclipse中安装spket插件
- codeblocks 设置vs2010编译器
- edep 初始化圈存,圈存流程、数据计算与示例
- Mathematica 入门笔记
- 优游平台总代怎么申请总代【总代Q941494533】疽
- c sharp 异步编程