反应式编程框架设计:如何使得程序调用不阻塞等待

article/2025/3/1 7:57:52

前言:

程序在高并发的情况下,程序容易崩溃。主要的原因是:在高并发的情况下,有大量用户请求需要程序计算处理,而目前的处理方式是,为每个用户请求分配一个线程,当程序内部因为访问数据库等原因造成线程阻塞时,线程无法释放去处理其他请求,这样就会早在请求的堆积,不断的消耗资源,最终导致程序的崩溃。

传统的Web应用程序运行期间的线程特性。一个高并发的应用程序,总是同时有多个用户请求到达系统的Web容器,Web容器为每个请求分配一个线程进行处理,线程在处理的过程中,如果遇到访问数据库或者远程服务等操作,就会进入阻塞状态,这个时候,如果数据库或者服务响应延迟,就会出现程序内的线程无法释放的情况,而外部的请求不断进来,导致计算机资源很快被快速消耗,最终导致程序崩溃。

反应式编程:

反应式编程本质上市一种异步编程方案,在多线程、异步方法调用、异步IO访问等技术的基础上,提供了一整套与异步调用相匹配的编程模型,从而实现程序调用非阻塞、即时响应等特性,即开发出 一个反应式的系统,以应对编程领域越来越高的并发处理要求。

即时响应:

应用调用者可以即时得到响应,无需等到整个应用程序执行完毕,也就是说应用调用是非阻塞的

回弹性:

当应用程序部分功能失效的时候,应用系统本身能够进行自我修复,保证正常运行,保证响应,不会出现系统崩溃和宕机的情况

弹性:

系统能够应用负载压力作出响应,能够自动伸缩适应应用负载的压力,根据压力自动调整自身的处理能力,或者根据的处理能力,调整进入系统中的访问请求数量

消息驱动:

功能模块之间、服务之间、通过消息进行驱动、完成服务的流程

目前主流的反应式编程框架有RxJava、Reactor等,主要的特点是基于观察者设计模式的异步编程方案,编程模型采用函数式编程。

观察者模式和函数式编程有自己的优势,但是反应式编程并不是必须要用观察者模式和函数式编程。Flower就是一个纯消息驱动,完全异步,支持命令式编程的反应式编程框架。

反应式编程框架Flower的基本原理:

当并发用户到达应用服务器的时候,Web容器线程不需要执行应用程序代码,只是将用户的HTTP请求变为请求的对象,将请求对象异步交给Flower矿建的Service去处理,自身立刻就返回,因为容器线程不要做太多的工作,所以只是需要极少的容器线程就可以满足高并发的用户请求,用户的请求不会被阻塞,不会因为容器线程不够而无法进行处理。相比传统的阻塞式的编程,Web容器线程要全部的请求处理操作,一直要等到返回响应结果才能释放线程;

使用Flower框架只需要极少的容器线程就可以处理较多的并发用户请求,而且容器线程不会阻塞。

用户请求交给基于Flowerr框架开发业务Service对象以后,Service之间依然是使用异步消息进行消息的通信调用,不会直接进行阻塞式的调用。一个Service完成业务逻辑处理之后,会返回一个处理结果,这个结果以消息的方式异步发给他的下一个Service

传统编程模型Service之间如果进行调用,被调用者返回之前,调用者Service方法只能阻塞等待。而Flower的Service之间使用了AKKA Actor进行消息的通信,调用者的Service发送调用消息之后,不需要等待被调用者返回的结果,就可以处理下一个消息了,事实上,这些Service可以复用同一个线程去处理自己的消息,也就是说,只需要有限的几个线程就可以完成大量的Service处理和消息的传输,这些线程不会阻塞等待。

通常Web应用主要的线程阻塞,是因为数据库访问导致的线程阻塞,Flower支持异步数据库驱动,用户请求数据库的时候,将请求提交给异步数据库驱动,立刻就可以返回,不会阻塞当前线程,异步数据库访问连接远程数据库,进行真正的数据库操作,得到结果之后,将结果以异步回调的方式发送给Flower的Service进行进一步的处理操作,这个时候依然不会有阻塞的线程。

也就是说,使用Flower开发的系统,在一个典型的Web应用中,几乎没有任何地方会被阻塞,所有的线程都可以被不断地复用,有限的线程就可以完成大量的并发用户请求,从而大大提高了系统的吞吐能力和响应能力。应用不会因为并发量太大或者数据库处理缓慢而宕机,从而提高了系统的可用性。

Flowerr框架实现异步无阻塞,一方面是利用了Web容器的异步特性,主要是Servlet3.0以后提供的AsyncContext,快速释放容器线程;另一方面是利用了异步的数据库驱动以及异步的网络通信,主要是HttpAsyncClient等一些异步的组件。核心的应用代码之间的异步无阻塞调用,则是利用Akka的Actor模型实现。

一个Actor向另一个Actor进行通讯的时候,当前Actor就是一个消息的发送者sender,当它想要向另一个Actor进行通讯的时候,就需要获取另一个Actor的ActorRef的一个引用,通过引用进行消息的通信,而ActorRef收到消息之后,会将这个消息放入目标Actor的Mainbox里面,然后就立即返回。

也就是说发送消息的时候,不需要真正的处理这个消息,只需要将消息发送到目标Actor的Mainbox里面就可以了,自己不会被阻塞,可以继续执行自己的操作,而目标的Actor检查自己的Mainbox中是否有消息,如果有消息,Actor则会在从Mainbox里面取获取消息,对消息进行异步的处理,而所有的Actor会共享线程,这些线程不会有任何的阻塞。


http://chatgpt.dhexx.cn/article/ySfXFtDe.shtml

相关文章

TensorFlow编程框架基础

一、为什么要使用编程框架 深度学习的算法具有多层结构,每层的运算由一些基本操作构成,这些基本操作中存在大量共性运算,如卷积、池化、激活等。 将这些共性运算操作封装起来,可以提高编程实现效率。 面向这些封装起来的操作&am…

c语言编程框架_编程语言和框架的状态

c语言编程框架 作为专业的软件交付人员,我喜欢掌握技术趋势和“市场可能走向何方”。 在过去的十五年中,已经出现了许多语言和框架,并且几乎没有任何真正的持久力。 为了在“人们想知道的事情”上适销对路,使我知识广博&#xff0…

MFC编程框架总结

简介 MFC是一种C类库,利用面向对象的方法封装了Windows API,为Windows应用程序的开发带来了极大便利。本文总结了使用MFC进行编程的基本方法,编程环境为VS2008 SP1。 搭建MFC开发环境 由于使用MFC应用程序向导后VS会自动生成应用程序框架&am…

并发编程框架----disruptor框架(一)

背景 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后&…

网络编程框架

网络编程 Socket网络通信编程 Socket主要解决一个网间进程通信(不同主机进程间的相互通信问题)。 提供进程通信的端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到…

您所应了解的Python四大主流网络编程框架

**本文内容摘录自《Python高效开发实战——Django、Tornado、Flask、Twisted》一书。**该书分为三部分:第1部分是基础篇,带领初学者实践Python开发环境和掌握基本语法,同时对网络协议、Web客户端技术、数据库建模编程等网络编程基础深入浅出地…

常见编程/框架介绍

文章大纲 一、C/C二、C#三、cocos2d-x四、go语言五、Hadoop六、HBase七、PHP八、python九、Spark十、Storm十一、Unity3D十二、Java十三、Android十四、Object-C与swift十五、.NET十六、R语言 一、C/C 1. 简介 C语言是目前世界上流行、使用最广泛的高级程序设计语言。C语言对操…

Linux 应用编程框架

粗略的复习下linux应用编程的一些知识,画个导图记录总结下:

Python 四大主流 Web 编程框架

目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实。但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架开发的常用知识,及目前的4种主流Python网络框架:Django、Tornado、Flask、Twisted。 …

【常见编程/框架介绍】

目录 一、C/C 1. 简介 2. 特点 3. 优点 4. 缺点 5. 常见使用场景 二、C# 三、cocos2d-x 四、go语言 1. 简介 2. 优点 3. 缺点 4. 就业方向 五、Hadoop 1. 简介 2. 优势 3. 应用场景 六、HBase 七、PHP 1. 简介 2. 优点 3. 缺点 4. 就业方向 八、python …

mac命令行查看dSYM文件的UUID

通过命令行查看 *.dSYM 文件的UUID值,标准范式: xcrun dwarfdump --uuid dSYM文件 实例演示: 想查看 Electron Framework.dSYM 的UUID值: 结果:5BE9E0C9-3946-3E4D-B12A-595EDA5170AF

dSYM的简单介绍

通过http://www.cocoachina.com/ios/20100427/1222.html 这篇文章,结合自己日常工作的理解,提炼了一下主要内容 一、dsym是什么? 在XCODE编译项目之后,会在app旁看见一个同名的dSYM文件.(rd称之为 符号文件)他是一个编…

dSYM 文件分析工具

我在项目中使用了百度统计,友盟统计也可以,上线项目出bug的时候,错误信息统计中能比较方便的找出客户端异常的信息,可是很多像数组越界却只给出了 *** -[__NSArrayM objectAtIndex:]: index 50 beyond bounds [0 .. 39] 这类错误信…

firebase_crashlytics缺失dSYM unity ios

Firebase后台提示缺失dSYM文件的截图 解决方案: 一、找dSYM: 方法一: 打开xcode->window->organizer->选择你的版本包archives->show in finder->显示包内容->里面即可看到.dSYM文件 方法二: 打开终端&#…

iOS-详解没有dSYM文件 如何解析iOS崩溃日志

Xcode支持崩溃日志自动符号化,前提是本地有当时Build/Archive生成的dSYM文件,iOS崩溃日志符号化后,可以帮助开发者更好的定位问题,但如果dSYM文件丢失或拿到的崩溃日志不是标准的crash log,如何定位crash呢&#xff0c…

iOS开发-dSYM文件

文章目录 dSYMxcode的符号化解析每个架构的符号 Bitcode相关定位你的dSYMBuild UUID对比恢复隐藏的符号表文件符号化解析操作命令命令行工具 symbolicatecrash 符号化 dSYM 根据 苹果官方文档,当编译器将源代码转为机械码时,会生成调试符号(debug symbo…

ios崩溃日志分析,无dSYM文件

问题场景 大部分情况下,我们都拿不到dSYM文件,只有一份ipa文件一个crash文件,应该如何定位具体崩溃的代码呢? 实例说明 首先本人建立了一个demo工程,写了一段会crash的代码,如下图 然后打包成ipa包&…

命令行工具解析Crash文件,dSYM文件进行符号化

https://www.jishux.com/p/10628644fe5dabf3 序 在日常开发中,app难免会发生崩溃。简单的崩溃还好说,复杂的崩溃就需要我们通过解析Crash文件来分析了,解析Crash文件在iOS开发中是比较常见的。 获取崩溃信息方式 在iOS中获取崩溃信息的方…

iOS-dSYM 文件分析工具

来到新公司后,前段时间就一直在忙,前不久 项目 终于成功发布上线了,最近就在给项目做优化,并排除一些线上软件的 bug,因为项目中使用了友盟统计,所以在友盟给出的错误信息统计中能比较方便的找出客户端异常…