远方的灯塔 - 专注于服务端技术分享 远方的灯塔 - 专注于服务端技术分享
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)

Terwer Green

一个后端老菜鸟
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)
  • JavaSE

  • 开源框架

  • Linux

  • Struts2

  • Hibernate

  • Webservice

  • 分布式

    • RPC架构设计及IO模型
    • NIO编程及其三大核心原理
    • NIO三大核心之缓冲区(Buffer)
    • NIO三大核心之通道(Channel)
    • NIO三大核心之选择器(Selector)
    • Netty核心原理
    • 线程模型以及传统IO阻塞模型
    • Reactor模型
      • Netty线程模型
      • Netty核心API介绍
      • Netty入门与异步模型
      • Netty高级进阶之Netty编解码器
      • Netty高级进阶之基于Netty的群聊天室案例
      • Netty高级进阶之基于Netty的HTTP服务器开发
      • Netty高级进阶之基于Netty的Websocket开发网页聊天室
      • Netty高级进阶之Netty中的粘包和拆包的解决方案
      • Nety源码剖析
      • 自定义RPC框架之分布式架构网络通信理论
      • 自定义RPC框架之基于Netty实现RPC框架
      • 分布式架构理论
      • 分布式理论之数据一致性
      • 分布式理论之CAP定理
      • 分布式理论之BASE定理
      • 分布式一致性协议之两阶段提交协议(2PC)
      • 分布式一致性协议之三阶段提交协议(3PC)
      • 分布式一致性协议之NWR协议
      • 分布式一致性协议之Gossip协议
      • 分布式一致性协议之Paxos协议
      • 分布式一致性协议之Raft协议
      • 分布式一致性协议之Lease机制
      • 分布式系统设计策略之心跳检测
      • 分布式系统设计策略之高可用
      • 分布式系统设计策略之容错性
      • 分布式系统设计策略之负载均衡
      • 分布式架构服务调用
      • 分布式服务治理之服务协调
      • 分布式服务治理之服务削峰
      • 分布式服务治理之服务降级
      • 分布式服务治理之服务限流
      • 分布式服务治理之服务熔断
      • 分布式服务治理之服务链路追踪
      • 架构设计基本原则之开闭原则(OCP)
      • 架构设计基本原则之单一职责原则(SRP)
      • 架构设计基本原则之接口隔离原则(ISP)
      • 架构设计基本原则之里式替换原则(LSP)
      • 架构设计基本原则之依赖倒置原则(DIP)
      • 架构设计基本原则知识扩展
      • 分布式架构知识拓展与总结
    • 分布式框架

    • 后端开发
    • 分布式
    terwer
    2022-05-04
    目录

    Reactor模型

    # Reactor模型

    通过一个或者多个输入传递给服务器的模式,服务端程序处理传入的多个请求,并将他们同步分派到处理线程,Reactor模式也叫Dispatch模式。

    Reactor模式使用IO复用监听事件,分发给某个线程(进程),这是网络服务器高并发处理的关键。

    1. 单Reactor单线程

      image-20220419181815189

      • Selector可以实现应用程序通过一个阻塞对象监听多路连接请求
      • Reactor对象通过Selector监控客户端请求事件,收到事件后通过Dispatch进行分发
      • 如果是建立连接请求事件,则由Acceptor通过Accept处理连接请求,然后创建一个handler处理连接完成后的后续业务逻辑
      • Handler会完成Read->业务处理->Send的完整业务流程

      优点:

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

      缺点

      1. 性能问题

        只有一个线程,无法发挥多核CPU的性能。Handler在处理某个连接上的业务时,整个线程无法处理其他连接事件,容易造成性能瓶劲

      2. 可靠性问题

        线程意外终止或者陷入死循环,会导致整个通信模块不可用,不能接收和处理消息,造成节点故障。

    2. 单Reactor多线程

      image-20220419212849627

      • Reactor对象通过Selector监控客户端请求事件,收到时间后通过Dispatch进行分发
      • 如果建立连接请求,则由Acceptor通过Accept处理请求
      • 如果不是连接请求,则由Reactor分发,调用连接对应的handler进行处理
      • handler只负责响应事件,不做具体的业务处理,通过read读取数据后,会分发给后面的worker线程池的某个线程进行处理
      • worder线程池会分配独立线程完成真正的业务,并将结果返回给handler
      • handler收到响应后,通过send将结果返回给client

      优点

      可以充分利用多核CPU的处理能力

      缺点

      多线程数据共享和访问复杂。

      reactor处理所有事件的监听和响应,在单线程运行,在高并发场景容易出现性能瓶劲

    3. 主从Reactor多线程

      image-20220419213713256

      • Reactor主线程MainReactor对象通过select监听客户端事件,收到事件后,通过Acceptor处理客户端连接事件。

      • 当Acceptor处理完客户端连接事件之后(与客户端建立好socket连接),MainReactor将连接分配给SubReactor。

        MainReactor只负责监听客户端连接请求,和客户端建立连接之后,交由SubReactor监听后面的IO事件。

      • SubReactor将连接加入到自己的连接队列,进行监听,并创建handler对各种事件进行处理。

      • handler通过read从连接中读取数据,将请求数据分发给worker线程,进行业务处理。

      • worder线程池分别独立的线程进行真正的业务处理,并将处理结果返回给handler。

        handler通过send向客户端发送数据。

      • 一个MainReactor可以对应多个SubReactor,即一个MainReactor线程可以对应多个SubReactor线程。

      优点

      1. MainReactor线程与SubReactor线程数据交互简单,职责明确,MainReactor线程只需要接收新连接,SubReactor完成后续的线程处理
      2. MainReactor线程与SubReactor线程数据交互简单,MainReactor线程只需要把新连接传递给SubReactor,SubReactor无需返回数据
      3. 多个SubReactor能够应对高并发的需求

      缺点

      编程复杂度高。

      由于优点明显,多个项目广泛使用。例如Nginx、Mencached、Netty等。

      这种模式也叫做服务器的1+M+N模式,即该模式开发包含1个(或者多个,1代表相对较少)服务器+M个连接建立的线程+N个业务处理线程。

      这是业界成熟的服务器设计模式。

    编辑 (opens new window)
    #io#reactor
    上次更新: 2023/02/22, 13:47:25
    线程模型以及传统IO阻塞模型
    Netty线程模型

    ← 线程模型以及传统IO阻塞模型 Netty线程模型→

    最近更新
    01
    解决css部分border被圆角切掉之后圆角的边框消失问题
    03-18
    02
    使用TypeScript开发一个自定义的Node-js前端开发脚手架
    03-08
    03
    Github-Actions使用release-please实现自动发版
    03-06
    更多文章>
    Theme by Vdoing | Copyright © 2011-2023 Terwer Green | MIT License | 粤ICP备2022020721号-1 | 百度统计
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式