JemmyH / gogoredis

[Doing]学习项目,尝试使用golang实现redis的大部分核心功能
MIT License
0 stars 0 forks source link

Reactor 模型 #8

Open JemmyH opened 3 years ago

JemmyH commented 3 years ago

The reactor design_pattern is an event_handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers. ----Wili--Reactor_pattern

Reator 是一种事件处理模型,并发处理请求,然后对请求进行多路分解,并将它们同步分派给关联的请求处理程序。本 issue 旨在搞清楚此模型的运作方式、高效的原因 以及 有哪些对其进行的相关改进措施。

JemmyH commented 3 years ago

服务器线程模型

在高性能的网络 I/O 设计中,有两个著名的模型: Reactor模型Proactor模型,前者用于 同步 I/O,后者用于 异步 I/O。有一点可以明确,不管是哪个模型,其目的都是提高服务端程序的并发能力。

对于支持多连接的服务器,一般情况下可以总结为 2种fd3种事件流程图 2种fd

3种事件

JemmyH commented 3 years ago

Reactor 模型

在这个模型中,有三种角色:

从上面的定义以及这里的角色我们可以有一个大概的轮廓:

  1. 事件驱动;
  2. 可以处理一个或者多个输入源;
  3. 通过多路复用将请求的事件分发给对应的处理器处理。

Reactor 线程模型分类

根据 Reactor的数量处理资源的线程数量,分为三类:

1. 单 Reactor 单线程模型

在 Reactor 中处理并分发事件,如果是连接事件就交给 Acceptor,如果是读写事件就交给对应的 Handler 进行业务处理。这三个角色其实是一个线程在工作,始终是一个线程在处理所有的事。

2. 单 Reactor 多线程模型

区别于第一种,这种模型主要将业务处理从 Reactor 的单一线程中脱离出来,换成了额外的线程池去处理。也就是说,Reactor 只处理连接事件和读写事件,业务处理交给了线程池,线程池可以充分利用多核机器的资源。

3. 多 Reactor 多线程模型

与第二种模型相比,将 Reactor 拆分成了 MainReactor 和 SubReactor,前者只处理连接事件,读写事件交给后者,业务逻辑依旧使用线程池来处理。

image