引言
本篇之所以要谈到异步和事件驱动,是因为这和Netty密切相关,尤其核心组件。所以很有必要先搞清楚什么是异步和事件驱动。
1、Java NIO
Java NIO,即Java非阻塞I/O的意思。Java对于非阻塞I/O的支持是在2002年引入的,位于JDK 1.4的java.nio包中。NIO最开始是新的输入/输出(New Input/New Output)的英文缩写。但是,Java API已经出现足够长的时间了,不再是“新的”了。因此,如今大多数用户因为NIO代表非阻塞I/O(Non-blocking I/O)。
2、选择器
类java.nio.channels.Selector 是 Java 的非阻塞 I/O 实现的关键。它使用了事件通知 API 以确定在一组非阻塞套接字中有哪些已经就绪能够进行 I/O 相关的操作。因为可以在任何的时间检查任意的读操作或者写操作的完成状态,所以 一个单一的线程便可以处理多个并发的连接。 总体来看,与阻塞 I/O 模型相比,这种模型提供 了更好的资源管理:
1)、使用较少的线程便可以处理许多连接,因此也减少了内存管理和上下文切换所带来开销;
2)、当没有 I/O 操作需要处理的时候,线程也可以被用于其他任务。
3、异步和事件驱动
首先,异步也就是非同步。异步事件肯定大家多熟悉。比如:在收发邮件的时候,你可能会收到你已经发出去邮件对应的回复,也可能正在发送邮件的时候收到一个意外的消息。异步事件也可以具有某种有序关系。通常,你只有在问了一个问题的之后才会得到与之对应的答案。而你在等它的时候你也可以做点别的事情。
在日常生活中,异步在我们生活中处处可见,而你可能对它没有过多考虑。但是让一个计算机程序以相同的方式工作就会产生一些非常特殊的问题。在本质上,一个既是异步又是事件驱动的系统会表现出一种特殊的、对我们来说极具价值的行为:它可以以任意的时序响应,在任意一个时间节点产生事件。
这种能力反应出来的是最高级别的可伸缩性,且至关重要。我们把它定义为:“一种系统、网络或进程在需要处理的工作不断增长的时候,可以通过某种可行的方式或者扩大它的处理能力来适应这种增长的能力。”
4、异步和可伸缩性之间的联系
非阻塞网络调用使得我们可以不必等待一个操作的完成。完全异步的 I/O 正是基于这个特性构建的,并且更进一步:异步方法会立即返回,并且在它完成时,会直接或者在稍后的某个时间点通知用户。
选择器使得我们能够通过较少的线程便可监视许多连接上的事件。将这些元素结合在一起,与使用阻塞 I/O 来处理大量事件相比,使用非阻塞 I/O 来处理更快速、更经济。从网络编程的角度来看,这是构建我们理想系统的关键,而且你会看到,这也是
Netty 的设计底蕴的关键。
本章之所以介绍异步和事件驱动主要是为了后续阐述Netty核心组件铺路。