作者介绍
这次演讲的讲师是 Netty 项目领导者,同时也是经典书籍《Netty in Action》的作者 Norman Maurer。
演讲视频
Netty 4 中的优化
Netty 3 存在诸多明显的设计缺陷:
- 很多内存垃圾(在高并发的场景下,GC 的负担会变得更重);
- 很多内存拷贝(Java Heap -> OS 内存 -> Socket);
- 缺少一个好的内存池(频繁地创建和销毁直接内存将会非常损耗性能);
- 缺少对于 Linux 操作系统的优化(不能使用 Linux 操作系统下的特性);
- 不太合理的线程模型(Inbound 和 Outbound 的操作是在不同线程中的)。
Netty 4 对以上问题做了优化:
- 产生更少的内存垃圾,也会更少地触发 GC;
- 使用 JNI 来支持某些 Linux 操作系统下仅有的特性;
- 提供了一个高性能的 Buffer Pool;
- 定义了一个易于使用的线程模型。
ChannelPipeline
Netty 中的 Channel 是对 Socket 的抽象,可以用于网络数据的读取和写入。每个 Channel 会对应一个 ChannelPipeline,ChannelPipeline 是一个包含了不同 ChannelHandler 的双向链表,ChannelHandler 可以用于处理 Inbound 和 Outbound 事件。
+------------------+
| Channel |
| |
| +-------+----------------------------------+
| | | ChannelPipeline |
+----------+-------+ |
^ | | |
| | | +-------+ +-------+ +-------+ |
| v | |Channel| |Channel| |Channel| |
| IN -->|---->|Inbound|-->|Inbound|-->|Inbound| |
| | |Handler| |Handler| |Handler| |
| | +-------+ +-------+ +-------+ |
| | |
| | +--------+ +--------+ |
| | |Channel | |Channel | |
OUT <----|<-------|Outbound|<-----|Outbound| |
| |Handler | |Handler | |
| +--------+ +--------+ |
| |
+------------------------------------------+
减少内存垃圾
Netty 中引入了一个非常轻量级的对象池。在 Netty 中存在着许多可以被复用的对象,并且这些对象会被限制在同一个线程中,例如在把 Byte 转换为 List