Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >小满寻秘境 · Reactor线程模型

小满寻秘境 · Reactor线程模型

作者头像
简熵
发布于 2023-03-06 13:34:27
发布于 2023-03-06 13:34:27
3040
举报
文章被收录于专栏:逆熵逆熵

目录

1、前言 · 浅析IO模型

2、图解BIO之传统编程模型

3、基于I/O复用模型的Reactor模式

4、Reactor模式的多样变化

大家好,我叫圆满,大家都叫我小满。中间件的世界很精彩,我接受召唤,去探寻在中间件世界中的大放异彩的王者秘境-Netty,netty的线程模型采用了Reactor模式,今天我们就开篇谈一谈网络IO编程的一些小事,还有Reactor模式的解读。

1、前言 · 浅析IO模型

IO操作,包括网络IO,文件IO。本文讨论的是网络编程中的概念。IO模型的话,很多大佬都做过深入分析,一般分为5种模型。我们这边也不去从LInux系统底层去深度剖析,从下面的IO模型对比图,可以理解区别一下 同步阻塞 这四字中同步和阻塞各自的含义。

如图中所示,其实我们操作IO一般就是分为俩个过程,等待数据就绪,拷贝数据从内核复制到用户空间。前四种模型都是阻塞的,并且第二阶段都是阻塞的。我们可以从下面的概念来理解一下同步、阻塞的概念。

阻塞调用非阻塞调用,阻塞调用,调用结果返回之前,当前线程会被挂起,一直等待,直到结果返回;非阻塞调用则不用等调用结果返回,不会阻塞当前线程,可以去干其他事情。

同步处理异步处理,同步处理是指,被调用方得到最终结果之后返回给调用方;异步处理是指,被调用方不等处理结束先返回响应,再进行计算,当计算完成时,通知调用方并将结果返回给调用方。

02

图解BIO之传统编程模型

BIO,BLockingIO,同步阻塞模式。当我们调用类似accept(),read(),connect()等API操作时,系统调用会卡住。例如,我们调用read()方法从socket中去读取数据,但是其实我们无法预知对方数据是否发送,只能是一直等待或者网络超时。这是我们传统的阻塞式网络编程,一个线程被挂起,望眼欲穿,什么事情也干不了,干等着。

想想看,要是有个几千几万的连接过来,那么我们得启动对应数量的线程大军,全都hang住,这对操作系统来说是灾难性的。线程越多,Context Switch操作越多,这会消耗大量CPU。并且每一个线程都会使用一定大小的栈,要是有成千上万的线程,那么内存消耗也是很吓人的,虽然可以通过大内存撑起了上万并发,那百万,千万呢?不过系统稳定性和成本都会指数爆炸。

也有人提出使用线程池去优化,避免产生大量的线程,但是这样做同时也限制了连接数量,这肯定不是最优解,如果是一个对外的TCP服务,网络连接数量是不可预估的。

03

基于I/O复用模型的Reactor模式

当~当~当~,NIO就要闪亮登场,NON-Blocking,同步非阻塞模式,和BIO的区别是什么呢?我们同样进行read操作,BIO一个客户端连接对应一条处理线程,在没有数据过来的时候,read操作就会一直卡在那里;NIO不是这样子的,一旦调用read()操作就会马上返回,没有数据就会返回-1,有数据就返回读取的字节数。

一般我们会采用I/O多路复用的模型,多个连接共用一个对象,应用程序只需要在一个对象上阻塞住,无需阻塞等待所有的连接。当某条连接有新的数据可以处理的时候,就由系统通知应用程序,阻塞的线程就会唤醒,准备进行业务处理。

这时候不会采用BIO中那种一个连接对应一个线程的方式,我们采用线程池,复用线程资源,将连接完成的业务处理任务分发给线程池中的线程进行处理,一个线程可以处理很多连接的业务。

基于线程池+I/O复用模型,这就是Reactor模式基本设计思想。

Reactor模式,通过一个或者多个输入同时传递给服务端请求的事件驱动处理模式。服务端处理多路请求,将请求分发给请求对应的处理线程。I/O多路复用统一监听多个事件,当接收到事件的时候分发给处理线程。

04

Reactor模式的多样变化

Reactor模式最基本的俩个组件:

  • Reactor,反应器,起反应的人,他就像是电话接线员,接听来自各个地方的客户电话并转移到适当的联系人。一般Reactor运行在一个线程或者进程上,负责监听和分发事件,有事件到来,就分发给适当的处理线程去对IO事件做出反应。
  • Handlers,操作者,就好比是公司里的业务员。处理执行I/O事件要完成的实际事件,主要是Reactor调度给他,适当地执行非阻塞的操作。

根据Reactor的数量和处理资源线程池的数量不同我们可以有以下三种变化:

  1. 单Reactor单线程
  1. 单Reactor多线程
  1. 主从Reactor多线程

最后,我们可以总结一下,Reactor模式具有如下的优点:

  1. 响应快,不必为单个同步时间所阻塞,虽然Reactor本身依然是同步的
  2. 编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销
  3. 可扩展性,可以方便的通过增加Reactor实例个数来充分利用CPU资源
  4. 可复用性,Reactor模型本身与具体事件处理逻辑无关,具有很高的复用性
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 逆熵架构 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
原来 8 张图,就能学废 Reactor 和 Proactor
别小看这两个东西,特别是 Reactor 模式,市面上常见的开源软件很多都采用了这个方案,比如 Redis、Nginx、Netty 等等,所以学好这个模式设计的思想,不仅有助于我们理解很多开源软件,而且也能在面试时吹逼。
小林coding
2021/05/27
1K0
原来 8 张图,就能学废 Reactor 和 Proactor
彻底搞懂Reactor模型和Proactor模型
在高性能的I/O设计中,有两个著名的模型:Reactor模型和Proactor模型,其中Reactor模型用于同步I/O,而Proactor模型运用于异步I/O操作。
全菜工程师小辉
2019/08/16
42.3K4
面试官:谈谈你对Reactor模型的理解?
Reactor 模型是一种事件驱动的高性能网络编程模型,主要用于处理高并发的网络 I/O 请求。其核心思想是通过一个或多个线程监听事件,并将事件分发给相应的处理程序,从而实现高效的并发处理。
磊哥
2025/03/23
1060
面试官:谈谈你对Reactor模型的理解?
Netty高性能架构之Reactor模式
  在讨论Netty的架构模式之前,我们先来介绍下Reactor模式,因为Netty的架构模式是在此基础上演变而来的
用户4919348
2019/12/31
1.3K0
​网络 IO 演变发展过程和模型介绍
作者:jaydenwen,腾讯 pcg 后台开发工程师 在互联网中提起网络,我们都会避免不了讨论高并发、百万连接。而此处的百万连接的实现,脱离不了网络 IO 的选择,因此本文作为一篇个人学习的笔记,特此进行记录一下整个网络 IO 的发展演变过程。以及目前广泛使用的网络模型。 1.网络 IO 的发展 在本节内容中,我们将一步一步介绍网络 IO 的演变发展过程。介绍完发展过程后,再对网络 IO 中几组容易混淆的概念进行对比、分析。 1.1 网络 IO 的各个发展阶段 通常,我们在此讨论的网络 IO 一
腾讯技术工程官方号
2021/02/25
1.6K0
Linux高性能IO网络模型对比分析:Reactor vs Proactor
随着互联网的发展,面对海量用户高并发业务,传统的阻塞式的服务端架构模式已经无能为力。本文旨在为大家提供有用的高性能网络编程的I/O模型概览以及网络服务进程模型的比较,以揭开设计和实现高性能网络架构的神秘面纱。 2、关于作者 陈彩华(caison):主要从事服务端开发、需求分析、系统设计、优化重构工作,主要开发语言是 Java。 3、线程模型 上篇《高性能网络编程(五):一文读懂高性能网络编程中的I/O模型》介绍完服务器如何基于 I/O 模型管理连接,获取输入数据,下面将介绍基于进程/线程模型,服务器如何处理请求。 值得说明的是,具体选择线程还是进程,更多是与平台及编程语言相关。 例如 C 语言使用线程和进程都可以(例如 Nginx 使用进程,Memcached 使用线程),Java 语言一般使用线程(例如 Netty),为了描述方便,下面都使用线程来进行描述。 4、线程模型1:传统阻塞 I/O 服务模型
sunsky
2021/01/06
4K0
NIO的好处,Netty线程模型,什么是零拷贝
Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)
lyb-geek
2019/11/20
1.6K0
Java NIO浅析
NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。 那么NIO的本质是什么样的呢?它是怎样与事件模型结合来解放线程、提高系统吞吐的呢? 本文会从传统的阻塞I/O和线程池模型面临的问题讲起,然后对比几种常见I/O模型,一步步分析NIO怎么利用事件模型处理I/O,解决线程池瓶颈处理海量连接,包括利用面向事件的方式编写服务端/客户端程序。
美团技术团队
2018/03/12
1.2K0
Java NIO浅析
Java NIO:浅析I/O模型
也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。下面本文先从同步和异步的概念 说起,然后接着阐述了阻塞和非阻塞的区别,接着介绍了阻塞IO和非阻塞IO的区别,然后介绍了同步IO和异步IO的区别,接下来介绍了5种IO模型,最后介绍了两种和高性能IO设计相关的设计模式(Reactor和Proactor)。
张哥编程
2024/12/19
1190
Java NIO:浅析I/O模型
Netty 线程模型(Reactor 线程模型)
Netty 线程模型(Reactor 线程模型)
Java架构师必看
2021/05/14
5800
Netty 线程模型(Reactor 线程模型)
关于Reactor模型
看了一些 Reactor 相关的文章和资料,列举的一些 Reactor 模型的优点,包括极客时间的文章也有讲过在架构中的Reactor中的优点和缺点。 但是如果不使用 Reactor 模型的一般方式是什么样子的?会有什么问题?
潇洒
2023/10/20
1950
关于Reactor模型
07-Netty 高性能架构设计-线程模型(Reactor模式)
1. Select是前面IO复用模型介绍的标准网络编程API,可以实现应用程序通过一个阻塞对象监听多路连接请求
彼岸舞
2022/02/18
4970
07-Netty 高性能架构设计-线程模型(Reactor模式)
Java体系之IO设计演进
在先前的文章《Unix之IO模型》已经讲述到5种IO模型以及对应的同步异步和阻塞非阻塞相关核心概念,接下来看下Java的IO模型在服务端的网络编程中是如何演进,注意这里用启动Java程序表示一个JVM进程,而JVM进程中以多线程方式进行协作,这里讲述以线程为主展开.
小坤探游架构笔记
2020/04/07
4330
Redis线程模型的前世今生
众所周知,Redis是一个高性能的数据存储框架,在高并发的系统设计中,Redis也是一个比较关键的组件,是我们提升系统性能的一大利器。深入去理解Redis高性能的原理显得越发重要,当然Redis的高性能设计是一个系统性的工程,涉及到很多内容,本文重点关注Redis的IO模型,以及基于IO模型的线程模型。
2020labs小助手
2021/11/30
3640
TAF 必修课(二):Reactor多线程模型
本文介绍了分布式服务框架Taf的线程模型设计和实现,包括IO线程、业务线程、线程调度、事件分发、请求应答、线程池、负载均衡、连接池、内存泄漏检测、日志输出、性能测试等方面的内容。
serena
2017/09/05
2.5K0
TAF 必修课(二):Reactor多线程模型
高性能IO编程设计
? 首先,在讲述高性能IO编程设计的时候,我们先思考一下何为“高性能”呢,如果自己来设计一个web体系服务,选择BIO还是NIO的编程方式呢?其次,我们可以了解下构建一个web体系服务中,为了能够支撑
小坤探游架构笔记
2020/04/07
1.2K0
谈谈Netty线程模型
Netty是一个高性能网络应用框架,应用非常普遍,目前在Java领域里,Netty基本上成为网络程序的标配了。Netty框架功能丰富,也非常复杂,今天我们主要分析Netty框架中的线程模型,而 线程模型直接影响着网络程序的性能。
架构狂人
2023/08/16
2300
谈谈Netty线程模型
Reactor线程模型
根据大神Doug Lea 在 《Scalable IO in Java 》中的介绍,Reacotr模型主要分为三个角色
每天晒白牙
2020/08/20
6300
Netty网络编程第六卷
1)获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求(1-3); 2)构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成(4); 3)返回数据,服务器将已构建好的响应再通过内核空间的网络 I/O 发还给客户端(5-7)。
大忽悠爱学习
2022/05/06
3890
Netty网络编程第六卷
说说Netty的线程模型
最近发现极客时间的很多课程中,都穿插到了 Netty,可见 Netty 的重要性。基于此,给大家推荐一下这篇文章!
Bug开发工程师
2019/08/20
5050
说说Netty的线程模型
相关推荐
原来 8 张图,就能学废 Reactor 和 Proactor
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档