Netty In Action 读书笔记 - 第四章 传输

本章包括:
1、传输
2、NIO、OIO、本地、嵌入式
3、用例
4、APIs

传输
Netty易于在NIO、OIO传输模式之间切换,且代码变动很少;

传输API
Channel接口:


如图所示,每个channel都被分配了一个ChannelPipeline和ChannelConfig。

ChannelConfig存储了所有channel相关的配置,并允许运行时更新配置。
ChannelPipeline持有所有的ChannelHandler实例,用以处理Channel中传输的到达/出站数据,同样可以在运行时添加/删除ChannelHandler。

Channel本身也提供了很多重要的方法:
eventLoop()、pipeline()、isActive()、localAddress()、remoteAddress()、write()等。
Channel是线程安全的,这意味着从不同的线程中对它进行操作是安全的。它的所有方法在多线程的环境下都可以安全的调用。正因如此,我们可以放心的在自己的应用中存储Channel的引用,直到有写数据到远端的需求出现(甚至是在多线程环境下)。write方法同时还保证了消息是以被传递的顺序写出。

Netty自含的传输实现
名称包路径描述
NIOio.netty.channel.socket.nio使用java.nio.channels包作为基础,并由此使用选择器的方式
OIOio.netty.channel.socket.oio使用java.net包作为基础,并由此使用阻塞流
Localio.netty.channel.local可以通过管道在VM中通信的本地传输
Embededio.netty.channel.embedded嵌入式传输,在测试ChannelHandler实现的时候很有用

NIO
目前最常用的传输方式,思路是:
一旦一个Channel的状态发生变化,用户可以通过注册来获得通知。可能的变化有:
-一个新的Channel被接受,并且已经准备好传输;
-一个Channel的连接完成;
-一个Channel接收到数据,这些数据已经准备好被读取;
-一个Channel可以在通道上发送更多的数据;
具体实现负责响应状态变化,同时重置它们,并在状态发生变化时再次获得通知。这个通过一个线程监控状态更新,并相应的分派它们来实现的。

Selection Operation
名称描述
OP_ACCEPT在一个新的连接被接受、channel被创建时获得通知
OP_CONNECT在一个连接尝试结束时获得通知
OP_READ当数据已经准备好被从channel读出时获得通知
OP_WRITE当可能向channel中写入更多的数据时获得通知


1、新创建的channel注册到selector;
2、Selector管理状态的变化;
3、已经注册的channel;
4、Selector.select()方法阻塞,直到获得新的状态变化或超出给定的超时时间;
5、检查是否有状态变化发生;
6、处理状态变化;
7、在selector运行的线程中执行其它的任务;

由于selector要响应状态变化,所以NIO在处理事件时可能存在延迟,和比OIO低的吞吐量,这在大量数据传输时会更明显。

“零拷贝”— 提供了一种从文件系统传输比特流到网络栈的方式,避免了将比特流从内核空间拷贝至用户空间。
注意:
1、并不是所有的操作系统都支持;
2、仅在不对数据进行加密/压缩时,才能从中受益(否则还是需要先将数据拷贝至用户空间,然后做加密、压缩等);
3、实际的应用:传输大文件的FTP、HTTP服务器;

OIO


1、为socket分配的线程;
2、Socket连接到远端;
3、读操作,可能阻塞;
4、读操作完成;
5、读操作完成,并且读到可以处理的数据,进行处理;
6、处理提交的属于socket的其他任务;
7、尝试重复读取;

Local - In VM transport
待补充。

Embedded transport
待补充。

一些经验:
低并发数 - 可以使用OIO传输模式作为开始,这时不需要担心连接数与线程数的限制。低于1000个并发连接可以被认为是低并发的。此时应用可以从OIO传输的低延迟中获益,也可能有更好的吞吐量。但即使并发数很低,NIO也可能更有优势,尤其是在连接非常“活跃”,OIO处理上写文切换会造成很大的影响。

高并发数 - 选择NIO,NIO用线程池处理大量的并发连接请求。

低延迟 - 如果应用对延迟很敏感,那么首先考虑使用OIO传输,但这可能会导致线程数增加。

阻塞应用升级 - 如果时间有限,可以使用OIO传输,在需要扩容的时候,在调整为NIO。

JVM内部通信 - 是使用Local transport最好的场景,没有了网络操作的消耗,同时还能够重用Netty的代码。在需要时,可以很容易的在网络上将服务暴露出去;

测试ChannelHandler实现 - 使用Embedded transport。

总结:
应用需要推荐的传输方式
低并发连接数OIO
高并发连接数NIO
低延迟OIO
阻塞应用升级OIO
JVM内部通信Local
测试ChannelHandler实现Embedded

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值