一、异步思想
异步思想就是,当执行一项耗时的操作时,不去等待操作结束,而是给这个操作一个命令:当操作完成 后,接下来去执行什么。
异步模型不会阻塞线程等待资源,而是在资源准备好后,再通知业务代码来完成后续的资源处理逻辑。 通过减少或避免线程等待,只用很少的线程就可以达到超高的吞吐能力。
异步实现比较复杂,会降低代码的可读性和可维护性。所以在业务逻辑简单并且需要超高吞吐量,或者必须长时间等待资源的场景,考虑使用异步模型。 比如IO密集型系统,就比较适合使用异步设计提升性能。
二、异步网络通信
一个TCP连接建立后,应用程序会获取一个用于收发数据的channel,每个channel在内存中开辟两片区 域用于缓存收发数据。
发送数据:只要我们发送数据的速度没有超过网卡传输速度的上限,发送数据的耗时就只是一次内存写 耗时而已。所以发送数据时同步发送就可以了。
接收数据:对于数据接收方而言,不知道什么时候会接收到数据。比较好的方法就是实现异步接收数据 ,用少量的线程处理大量的连接,有数据的到来的时候可以第一时间处理。当有数据到来的时候,自动执行处理逻辑的回调方法。
传统的同步网络IO,采用的都是一个线程对应一个channel接收数据,很难支持高并发和高吞吐量。
1、Netty框架实现异步网络通信
Netty是一个全异步的设计,其底层是基于Java NIO实现的,不过Netty提供了一组非常友好的API, Netty自动解决了线程控制、缓存管理、连接管理这些问题。
需要实现的业务代码就两个部分:一是把服务初始化并启动起来,二是实现收发业务逻辑的Handler。
2、使用NIO实现异步网络通信
NIO提供了一个Selector对象来实现一个线程对应多个网络连接的多路复用机制, 你可以直接在这个线程里面执行接收数据的业务逻辑, 也可以将任务分发给其他的线程处理。