JAVA 培训(五) Netty
Bootstrap继承结构
-
ChannelPipeline 责任链模式
在Netty里,Channel
是通讯的载体,而ChannelHandler
负责Channel中的逻辑处理。
那么ChannelPipeline
是什么呢?我觉得可以理解为ChannelHandler的容器:一个Channel包含一个ChannelPipeline,所有ChannelHandler都会注册到ChannelPipeline中,并按顺序组织起来。
ChannelEvent
是数据或者状态的载体,例如传输的数据对应MessageEvent
,状态的改变对应ChannelStateEvent
。当对Channel进行操作时,会产生一个ChannelEvent,并发送到ChannelPipeline
。ChannelPipeline会选择一个ChannelHandler进行处理。这个ChannelHandler处理之后,可能会产生新的ChannelEvent,并流转到下一个ChannelHandler。
-
bytebu
1. 从内存分配的角度有2类:
(1) 堆内存:优点是内存的分配和回收速度快,可以被自动回收,缺点是如果进行SocketIO的读写,需要额外一次的内存复制,将堆内存对应的缓冲区复制到内核Channel中,性能有一定程度损失。
(2) 直接内存:在堆外进行分配,相对分配和回收速度会慢一些,但是将它写入或者从Socket Channel读取时,少了一次内存复制,速度更快。
经验表明:ByteBuf的最佳实践是在I/O通信线程读写缓冲区使用DirectByteBuf,后端业务消息的编解码模块使用HeapByteBuf,这样组合可以达到性能最优。
2. 从内存回收角度上:
(1) 基于对象池的ByteBuf:内存池,可以循环创建ByteBuf,提升内存的利用率,降低高负载导致的频繁GC。
(2) 普通ByteBuf。
测试表明高负载使用内存池会更加的平稳。
尽管推荐使用基于内存池的ByteBuf,但是内存池的管理和维护更加复杂,也需要更加谨慎。