1. AIO 与 Netty 的边界
Java AIO(NIO.2 异步 I/O)与 Netty 在功能定位上的边界在哪里?什么场景下应该选择 AIO,什么场景下应该选择 Netty?
- Java AIO(AsynchronousSocketChannel/AsynchronousFileChannel)与 Netty 的事件驱动模型差异
- 三种 I/O 模型(BIO/NIO/AIO)的适用场景
- Netty 为何在通用网络框架中更受青睐
Java AIO(NIO.2)通过 AsynchronousSocketChannel、AsynchronousFileChannel 等提供真正的异步 I/O,由操作系统内核在 I/O 完成时回调,底层在 Linux 上通常基于 epoll 实现,在 Windows 上基于 IOCP 实现,属于"异步非阻塞"模型。Netty 则是一个基于 NIO(同步非阻塞 + Selector 多路复用)的事件驱动网络框架。两者的边界在于:AIO 是 JDK 提供的底层异步 I/O 能力,适合文件异步读写等场景;Netty 是在 NIO 之上封装出的完整网络框架,提供编解码、心跳、粘包拆包、线程池、背压等开箱即用的组件。在 Linux 上,AIO 的 epoll 实现并不比 NIO 的 Selector 有本质性能优势,且 Java AIO 的异常处理与回调使用不便,因此绝大多数的网络服务器(如各网关、中间件)都选择 Netty 而非原生 AIO。Netty 官方也明确表示不推荐在 Linux 上使用 AIO,因为其底层仍是 epoll,性能与 NIO 相当。
理解边界的关键是"异步"与"非阻塞"的区分。AIO 是内核级别完成后回调(异步),NIO 是应用层轮询就绪(非阻塞但同步)。Netty 选择 NIO 而非 AIO,是因为在 Linux 上两者性能相近,而 NIO 的模型更可控、更利于封装。因此 AIO 的适用场景主要是文件异步读写(AsynchronousFileChannel),网络并发场景通常选择 Netty。