前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >死磕Reactor模式

死磕Reactor模式

作者头像
早安嵩骏
发布2020-08-11 16:43:33
4470
发布2020-08-11 16:43:33
举报
文章被收录于专栏:程序猿人程序猿人

上两篇从I/O模型讲到了I/O多路复用器。这一篇主要总结下I/O多路复用器的主要应用——Reactor模式。

Reactor模式又称为反应器模式、分发者模式(Dispathcher)或者通知者模式(nitifier)。它是一种事件处理模式,用于处理由一个或者多个客户端并发交付给服务器的请求。对服务器来讲,CPU的速度远远高于I/O处理操作,如果因为I/O处理而阻塞CPU显然是不划算的,这促使了Reactor的诞生。

下图是Douglas C. Schmidt先生对Reactor的架构解析

Handles: 句柄,是一个标识符,只要获得对象的句柄,我们就可以对对象进行任意的操作

Synchronous Event Demultiplexer: 同步事件复用器,其实就是我们上一篇所写到的I/O多路复用器,它会阻塞等待Handler上一组事件的发生。

Initiation Dispatcher: 调度程序,它定义了注册、删除和分派事件处理程序的接口。I/O多路复用器负责等待新事件的发生,当它检测到新的事件时,会通知调度程序回调应用程序特定的事件处理程序。常见事件包括连接事件、数据输入和输出事件以及超时事件。

Event Handler: 事件处理接口,拥有一个回调方法;

Concrete Event Handler: 具体事件处理程序,实现了Event Handler接口;

具体的操作步骤可以用下图来表示:

  • 图中把具体的操作过程,分为2部分:初始化部分和事件处理部分。
  • 在初始化过程中,程序将Concrete Event_Handler注册到Initiation Dispather,并说明该处理程序所关注的事件类型;
  • 当所有Event Handler注册完毕的时候,程序进入事件处理阶段,并且启动Initiation Dispather的事件循环操作,事件循环操作主要是调用I/O多路复用器去等待Handler上发生的事件,并根据事件发生的类型,把他们转交给Concrete Event Handler。
线程模型

根据Reactor的数量和处理资源池线程的数量不同,Reactor有3种典型的实现方式:

1. 单Reactor单线程

如图,单Reactor单线程是指所有的I/O操作都是在同一个NIO线程上面完成的。

优点:模型简单,没有多线程、进程通信、竞争的问题,全部都在一个线程中完成;

缺点:性能问题,只有一个线程,无法发挥多核CPU的性能。Handler在处理某个连接上的任务时,整个进程阻塞;另外可靠性上也存在问题,一旦该线程意外终止,或者进入死循环,将导致整个应用不可用。

使用场景:客户端的数量有限、业务处理非常快速,比如Redis在业务处理的时间复杂度为O(1)的情况。

2. 单Reactor多线程

如图,单Reactor多线程模型与单Reactor单线程最大的区别是有一组NIO线程来处理I/O操作。

优点:可以充分的利用多核CPU的处理能力;

缺点:多线程数据共享和访问比较复杂,且Reactor承担和处理所有事件的监听和相应请求,单线程运行在高并发场景容易出现性能瓶颈;

3. 主从Reactor多线程

这个模式的特点是:服务端用于接收客户端连接的不再是一个单独的NIO线程,而是一个独立的NIO线程池。acceptor接收到了客户端TCP连接请求并处理完后,将新创建的SocketChannel注册到subReactor的某个I/O线程上,由它负责SocketChannel的读写和编解码工作。

Netty的线程模型

Netty的线程模型并非是一成不变的。Netty服务端在启动的时候,会同时配置bossEventLoopGroup和workerEventLoopGroup,其实就是分别指代了mainReactor和subReactor,通过对这两个EventLoopGroup的线程个数以及是否共享线程池等基础设置,Netty可以很轻松实现以上三种线程模型。

不过,Netty的实现不止于此,它通过很多细节上的处理使其性能达到最优。例如无锁化设计、暴露TCP参数、零拷贝等等。。我会在接下来的文章一一总结。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 线程模型
    • 1. 单Reactor单线程
      • 2. 单Reactor多线程
        • 3. 主从Reactor多线程
        • Netty的线程模型
        相关产品与服务
        云数据库 Redis
        腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档