深入浅出Netty源码剖析netty

Netty学习 - 从TCP服务器到I/O模型

2018-07-12  本文已影响37人  buzzerrookie

学习Netty就不得不从TCP服务器和I/O模型说起,了解TCP服务器架构和I/O模型的演进有助于深入了解Netty。

TCP服务器的架构

一般地,TCP服务器有两种套接字,监听套接字和已连接套接字。监听套接字用于TCP的监听,一旦连接建立便产生已连接套接字,服务器利用已连接套接字与客户端进行通信。

I/O模型

一个输入操作通常包括两个不同的阶段[1][2]

  1. 等待数据准备好
  2. 从内核向进程复制数据
(1) 阻塞式I/O模型
阻塞式IO模型.png
(2) 非阻塞式I/O模型
非阻塞式IO模型.png
(3) I/O复用模型
IO复用模型.png
(4) 信号驱动式I/O模型
信号驱动式IO模型.png
(5) 异步I/O模型
异步IO模型.png
同步I/O和异步I/O对比

POSIX把这两个术语定义如下:

根据上述定义,前4种模型——阻塞式I/O模型、非阻塞式I/O模型、I/O复用模型和信号驱动式I/O模型都是同步I/O模型,因为其中真正的I/O操作(recvfrom)将阻塞进程。只有异步I/O模型与POSIX定义的异步I/O相匹配。

Netty

Netty是一款异步的事件驱动的网络应用编程框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端。与使用阻塞I/O来处理大量事件相比,使用非阻塞I/O来处理更快速、更经济,Netty使用了Reactor模式将业务和网络逻辑解耦,实现关注点分离[3]

Reactor模式

Reactor模式(反应堆模式)是一种处理一个或多个客户端并发交付服务请求的事件设计模式。当请求抵达后,服务处理程序使用I/O多路复用策略,然后同步地派发这些请求至相关的请求处理程序[4]
Reactor模式中的角色:

单Reactor单线程

在这种模式中,Reactor、Acceptor和Handler都运行在一个线程中。


单Reactor单线程.png
单Reactor多线程

在这种模式中,Reactor和Acceptor运行在同一个线程,而Handler只有在读和写阶段与Reactor和Acceptor运行在同一个线程,读写之间对数据的处理会被Reactor分发到线程池中。


单Reactor多线程.png
多Reactor多线程

在这种模式中,主Reactor负责监听,与Acceptor运行在同一个线程,Acceptor会将已连接套接字的通道注册到从Reactor上,从Reactor负责响应和分发事件,起到类似多线程Reactor的作用。Netty服务端使用了该种模式。


多Reactor多线程.png

参考文献

[1].《UNIX环境高级编程》
[2].《UNIX网络编程》
[3].《Netty实战》
[4]. Scalable IO in Java

上一篇下一篇

猜你喜欢

热点阅读