Reactor学习redis线程模型有感

Posted icanhua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Reactor学习redis线程模型有感相关的知识,希望对你有一定的参考价值。

https://my.oschina.net/u/1859679/blog/1844109

 

该模式可以有简单实现、也可以多线程实现、要看场景,比喻redis的实现就是简单,因为都是基于内存操作。

学习下!

 

基于Reactor Pattern 处理模式中,定义以下三种角色:

  • Reactor 将I/O事件分派给对应的Handler

  • Acceptor 处理客户端新连接,并分派请求到处理器链中

  • Handlers 执行非阻塞读/写 任务

 

在 Douglas Schmidt 的大作《POSA2》中有关于事件处理模式的介绍,其中有四种事件处理模式:

  1. Reactor  

  2. Proactor  

  3. Asynchronous Completion Token  

  4. Acceptor-Connector  

1. Proactor

本文介绍的Reactor就是其中一种,而Proactor的整体结构和reacotor的处理方式大同小异,不同的是Proactor采用的是异步非阻塞IO的方式实现,对数据的读写由异步处理,无需用户线程来处理,服务程序更专注于业务事件的处理,而非IO阻塞。

2. Asynchronous Completion Token

简单来说,ACT就是应对应用程序异步调用服务操作,并处理相应的服务完成事件。从token这个字面意思,我们大概就能了解到,它是一种状态的保持和传递。

比如,通常应用程序会有调用第三方服务的需求,一般是业务线程请求都到,需要第三方资源的时候,去同步的发起第三方请求,而为了提升应用性能,需要异步的方式发起请求,但异步请求的话,等数据到达之后,此时的我方应用程序的语境以及上下文信息已经发生了变化,你没办法去处理。

ACT 解决的就是这个问题,采用了一个token的方式记录异步发送前的信息,发送给接受方,接受方回复的时候再带上这个token,此时就能恢复业务的调用场景。

 

技术图片

上图中我们可以看到在client processing 这个阶段,客户端是可以继续处理其他业务逻辑的,不是阻塞状态。service 返回期间会带上token信息。  

3. Acceptor-Connector

Acceptor-Connector是于Reactor的结合,也可以看成是一种变种,它看起来很像上面介绍的Reactor第三种实现方式,但又有本质的不同。

技术图片

Acceptor-Connector模式是将网络中对等服务的连接和初始化分开处理,使系统中的连接建立及服务一旦服务初始化后就分开解除耦合。连接器主动地建立到远地接受器组件的连接,并初始化服务处理器来处理在连接上交换的数据。同样地,接受器被动地等待来自远地连接器的连接请求,在这样的请求到达时建立连接,并初始化服务处理器来处理在连接上交换的数据。随后已初始化的服务处理器执行应用特有的处理,并通过连接器和接受器组件建立的连接来进行通信。

这么处理的好处是:

  1. 一般而言,用于连接建立和服务初始化的策略变动的频度要远小于应用服务实现和通信协议。

  2. 容易增加新类型的服务、新的服务实现和新的通信协议,而又不影响现有的连接建立和服务初始化软件。比如采用IPX/SPX通信协议或者TCP协议。

  3. 连接角色和通信角色的去耦合,连接角色只管发起连接 vs. 接受连接。通信角色只管数据交互。

  4. 程序员与低级网络编程API(像socket或TLI)类型安全性的缺乏屏蔽开来。业务开发关系底层通信

 

以上是关于Reactor学习redis线程模型有感的主要内容,如果未能解决你的问题,请参考以下文章

吃透Redis:网络框架篇-reactor模型

吃透Redis:网络框架篇-reactor模型

Redis的线程模型—文件事件处理器的详解

Redis篇:单线程 reactor 模型

Netty 4.x学习笔记——线程模型

Reactor事件模型在Redis中的应用