Netty底层io原理迭代史
1)传统阻塞IO模式:
-
存在的问题:
-
当并发数很大时,就会创建大量的线程,占用很大的系统资源。
-
当连接创建后,如果当前线程没有进行任何读写操作,线程会阻塞,造成系统资源的浪费。
2)Reactor模式:
通过一个或多个输入同时传递给服务器处理器的模式(基于事件驱动),采用IO多路复用监听事件(服务器高并发处理的关键),服务器程序处理多个请求后分发给对应的线程处理。
- 2.1 单Reactor单线程模式:
- 优点:模型简单,所有操作都在一个线程中完成,没有多线程、进程通信、竞争的问题。
- 缺点:无法完全发挥多核CPU的性能,很容易导致性能瓶颈。可靠性不高,线程意外终止时,会导致整个系统通信模块的不可用,造成节点故障。
- 实用场景:客户端数量有限,业务处理速度快。
- 2.2 单Reactor多线程模式:
- 优点:可以充分的利用多核CPU的处理能力,将业务处理分发,提高了业务处理效率和性能。
- 缺点:多线程数据共享和访问比较复杂,Reactor处理所有的事件的监听和响应,在单线程运行,高并发场景下容易出现性能瓶颈。
- 2.3主从Reactor多线程模式:
- 优点:父线程与子线程的职责明确,父线程只需要接收新连接,子线程完成后续的业务处理。Reactor主线程只需要把新连接传给Reactor子线程(Reactor子线程不止一个),子线程无需返回数据。
- 缺点:编码复杂
- 应用场景:许多项目中广泛应用,包括Nginx主从Reactor多进程模型,Memcached主从多线程,Netty主从多线程模型的支持。
3)Netty线程模式(主要基于主从Reactor多线程模式做了一定的改进):
- Netty抽象出两组线程池:
- 1.BossGroup专门负责接收客户端的连接。
- 2.WorkerGroup专门负责网络读写的业务处理。
- 底层都是运用了多个事件循环NioEventLoop不断循环分发处理客户端的连接请求和读写业务。
- Boss NioEventLoop循环步骤
- 1.轮询accept事件
- 2.处理accept事件,完成于客户端的连接,并将生成的SocketChannel注册到Worker NioEventLoop上的selector
- 3.处理任务队列的任务,即runAllTasks
- Worker NioEventLoop循环步骤
- 1.轮询read、write事件
- 2.在对应得SocketChannel处理I/O事件
- 3.处理任务队列的任务,即runAllTasks