searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Reactor设计模式介绍

2023-10-31 02:20:16
20
0

1、Reactor设计模式背景

  • 解决什么问题:
    • 该设计模式,是一种设计高性能服务器的设计模式,用于处理应用接收到的大量并发请求,基于事件的方式来做
  • 设计模式来源:
    • Douglas C. Schmidt的一篇论文提出Reactor:
      • 计算机科学家:道格拉斯·C·施密特 ,著作有C++ Network Programming
      • Reactor含义:
        • The Reactor design pattern handles service requests that are delivered concurrently to an application by one or more clients.
        • Reactor模式:用于处理应用接收到的大量并发请求

2、Reactor模式详解

  • Doug Lea 在Scalable IO in Java中说明了在java中如何实现Reactor模式
    • 计算机教授,主要研究并发编程和并发数据结构,是java并发库作者

2.1、传统方式痛点

  • 图示:
  • 代码说明:
    • 每个请求用一个线程去处理(这里不用在意是用new thread或者线程池)
    • 存在问题:IO线程和业务线程耦合在一起,当socket不可读的时候,整个线程就阻塞了
    •  

2.2、Reactor基础模式(单线程)

  • 图示:
  • 代码说明
    • 在一个Selector里监听:accept、read、write事件,监听到后,在同一个线程内处理业务逻辑
    • 注意:这里已经是基于事件的,不会阻塞IO读写(例如client一直不发请求)
    • 单线程版本适用场景:瓶颈在网络IO的业务,业务计算很快(例如redis,都是内存计算)
  • 缺点:
    • 很明显,因为只有一个线程,所以当其中一个请求处理很慢,就会卡住后面的请求

2.3、Reactor工作线程池模式

  • 图示:
  • 代码说明:
    • 可读的时候,将请求交给worker线程池处理
    • 好处:请求之间不会相互影响,A请求慢不会卡住B请求
  • 缺点:
    • 只有一个线程去监听全部事件,accept事件和read,write事件没有拆分
    • 当并发连接数多的时候,遍历处理read、write事件就耗时长,导致延迟处理accept事件

2.4、多个Reactor模式

  • 图示
  • 说明:
    • 拆分Acceptor监听线程,readwriter监听线程(根据实际情况可以拆多个)
    • tomcat的线程模型,类似这种方式
0条评论
0 / 1000
q****n
15文章数
0粉丝数
q****n
15 文章 | 0 粉丝