BIO:Blocking IO,传统IO模型,本身是同步阻塞模式。 (客户端在请求数据的过程中,保持一个连接不能做其他事情。) NIO:Non-blocking I/O,同步非阻塞的IO (客户端在请求数据的过程中,不用保持一个连接,不能做其他事情。(不用保持一个连接,而是用许多个小连接,也就是轮询)) AIO:异步非阻塞IO模型 (客户端在请求数据的过程中,不用保持一个连接,可以做其他事情。(客户端做其他事情,数据来了等服务端来通知。)) https://zhuanlan.zhihu.com/p/111816019

一、为什么要学异步和高并发

为什么在讲流计算之前,要先讲异步和高并发的问题呢?

其一,是因为“流”本质是异步的,可以说“流计算”也是一种形式的异步编程。

其二,是因为对于一个流计算系统而言,其起点一定是数据采集,没数据就什么事情都做不了,而数据采集通常就会涉及 IO 问题,如何设计一个高性能的 IO 密集型应用,异步和并发编程既是过不去的坎,也是我们掌握高性能 Java 编程的基础。

从数据采集模块切入,通过开发一个高性能的数据采集模块,从实战中理解 NIO、异步和高并发的原理。
image.png

二、BIO 和 NIO

BIO 连接器的问题

在 Tomcat 7 及之前的版本中, Tomcat 默认使用的是 BIO 连接器, BIO 连接器的工作原理如下图
image.png
当使用 BIO 连接器时,Tomcat 会为每个客户端请求,分配一个独立的工作线程进行处理。有多少个客户端同时发送请求就需要创建多少个线程。
所以,BIO 连接器的最大问题是它的工作线程和请求连接是对应耦合起来的

使用 NIO 支持百万连接

Tomcat 8 开始,Tomcat 已经将 NIO 设置成了它的默认连接器。
image.png

NIO 连接器相比 BIO 连接器,主要做出了两大改进。

  • 使用“队列”将请求接收器和工作线程隔开;
  • 引入选择器来更加精细地管理连接套接字。

三、NIO 结合 异步

优化 IO 和 CPU 都密集的任务