目录
网络通信模块的实现在源代码src/msg的目录下,该目录主要包括Messenger、Connection、Message、Dispatch等类,这些类定义了网络通信的框架与接口。
三个子目录simple、async、xio分别对应三种不同的网络通信模型。simple、xio在最新的版本中已经被废弃,async是目前系统默认的网络通信方式。
因此,本次网络通信优化的工作主要在async基础之上开展。
Reactor模型
为了处理高并发的网络I/O流,async模块采用了Reactor模型。在Reactor中,每一种handler会出处理一种event。这里会有一个全局的管理者selector,我们需要把channel注册感兴趣的事件,那么这个selector就会不断在channel上检测是否有该类型的事件发生,如果没有,那么主线程就会被阻塞,否则就会调用相应的事件处理函数即handler来处理。
Reactor模型原理
Reactor模型主要组件
Reactor模型的优点
响应快,不必为单个同步时间所阻塞,虽然Reactor本身依然是同步的;编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销; 可以方便的通过增加Reactor实例个数来充分利用CPU资源;reactor框架本身与具体事件处理逻辑无关,具有很高的复用性;
Reactor模型的缺点
相比传统的简单模型,Reactor增加了一定的复杂性,因而有一定的门槛,并且不易于调试; Reactor模式需要底层的Synchronous Event Demultiplexer支持,比如Java中的Selector支持,操作系统的select系统调用支持,如果要自己实现Synchronous Event Demultiplexer可能不会有那么高效;Reactor模式在IO读写数据时还是在同一个线程中实现的,即使使用多个Reactor机制的情况下,那些共享一个Reactor的Channel如果出现一个长时间的数据读写,会影响这个Reactor中其他Channel的相应时间,比如在大文件传输时,IO操作就会影响其他Client的相应时间,因而对这种操作,使用传统的Thread-Per-Connection或许是一个更好的选择,或则此时使用Proactor模式。
有限状态机(Finite State Machine, FSM),是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
FSM模型把模型的多状态、多状态间的转换条件解耦;可以使维护变得容易,代码也更加具有可读性。
(FSM说明文章:https://blog.csdn.net/bandaoyu/article/details/111626406)
AsyncConnection连接建立过程中地状态迁移图参阅附录(Ⅰ)。
Async模块
Async工作原理
Async主要组件
AsyncMessenger |
管理网络连接 |
AsyncConnection |
网路通信连接,定义网络通信应用层协议 |
NetworkStack |
管理Worker对象及其对应地线程 |
Worker |
网络I/O流处理单元,每个Worker对应一个工作线程 |
ServerSocket/ServerSocketImpl |
C/S模式监听套接字,向上屏蔽了各种不同的网络编程接口 |
ConnectedSocket/ConnectedSocketImpl |
C/S模式连接套接字,向上屏蔽了各种不同的网络编程接口 |
EventCenter |
事件分发器,负责事件注册、事件分发 |
EventCallback |
当对应的事件发生时,由EventCenter负责回调 |
EventEpoll |
对epoll进行封装,轮询网络I/O事件 |
RDMA是Remote Direct Memory Access的缩写,通俗的说可以看成是远程的DMA技术,为了解决网络传输中服务器端数据处理的延迟而产生的。
RDMA三种不同的硬件实现
目前,有三种RDMA协议的实现:Infiniband、RoCE、iWARP。由于RoCE具备明显性能和成本优势,将逐渐成为市场主流。
Infiniband
支持RDMA的新一代网络协议。
由于这是一种新的网络技术,因此需要支持该技术的NIC和交换机。
RoCE
一个允许在以太网上执行RDMA的网络协议。
其较低的网络标头是以太网标头,其较高的网络标头(包括数据)是InfiniBand标头。
这支持在标准以太网基础设施(交换机)上使用RDMA。
只有网卡应该是特殊的,支持RoCE。
iWARP
一个允许在TCP上执行RDMA的网络协议。
IB和RoCE中存在的功能在iWARP中不受支持。
这支持在标准以太网基础设施(交换机)上使用RDMA。
只有网卡应该是特殊的,并且支持iWARP(如果使用CPU卸载),否则所有iWARP堆栈都可以在软件中实现,并且丧失了大部分RDMA性能优势。
https://houbb.github.io/2019/11/20/rdma-01-protocol
软件栈对比
Infiniband (IB) |
iWARP |
RoCE |
|
标准组织 |
IBTA |
IETF |
IBTA |
性能 |
最好 |
稍差 |
与IB相当 |
成本 |
高 |
中 |
低 |
网卡厂商 |