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

news2024/11/24 20:54:42

前言:

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

传统的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://www.coloradmin.cn/o/102305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试:Java VS Python,刚开始应该选择哪门语言进行入门呢?

前言 当你学完软件测试基本理论,掌握业务测试流程,功能测试可以搞定,数据库和linux玩得也很溜时,接下来想进一步进阶,那么学习一门编程语言必不可少。 同时,学习一门编程语言也是你成为自动化测试工程师乃…

如何正确使用JMeter性能测试?紧扣面试实际要求

前段时间专门挑了一段时间在准备面试。经过两次面试后,有一些比较深刻的认识。对于企业要求来说,除了对专业理论知识考究之外,对测试工具这块也是看重的。 一、使用JMeter测试快速入门 1、线程组是什么 进程: 一个正在执行的程序…

图解设计模式: 有趣的工厂模式

工厂模式 Factory Method 在工厂模式中 父子类的关系就像是生产工厂中模具一样, 由父类负责指定实例生成的方式 子类来决定生成具体的类. 具体的处理全部交给子类负责,目的就是为了将生产实例的框架和负责实例生产类解耦 示例程序 从下面这段示例来看看工厂模式到…

Codeforces Round #839 (Div. 3)

A. AB? 题意: t组测试每组给出以ab的形式给出算式,求ab的值。(a,b都是0~9) 代码: tint(input()) for i in range(t):sinput()print(eval(s)) B. Matrix Rotation 题意: t组测试每组给一个2*2的矩阵&…

NoSQL数据库原理与应用综合项目——Redis篇

NoSQL数据库原理与应用综合项目——Redis篇 文章目录NoSQL数据库原理与应用综合项目——Redis篇0、 写在前面1、本地数据或HDFS数据导入到Redis2、Redis数据库表操作2.1 Java API 连接Redis2.2 查询数据2.3 插入数据2.4 修改数据2.5 删除数据3、Windows远程连接Redis(Linux)4、…

谁说女生不可以学编程?维密超模放弃年薪千万,一心只当程序媛

说到IT行业,大家第一反应应该是程序员 谁说女生不可以学编程?维密超模放弃年薪千万,一心只当程序媛 感觉一说起IT工作者 大家都会想到一个男性的形象 但是其实 有一批脸美、胸大、腰细、腿长、还都热爱编程的妹纸正在加入你们的行列&#…

(附源码)Springboot宠物领养系统 毕业设计 241104

Springboot宠物领养系统 摘 要 如今,随着人们生活水平不断提高,人们的生活在物质满足的基础上,更多的人将生活的重点放在追求精神享受的过程中。于此同时,Internet铺天盖地的普及,使得这样的人纷纷通过Internet的方式去…

springboot 3.0 工程建立

springboot 3.0 工程建立 脚手架搭建 进入spring官网提供的https://start.spring.io/进行脚手架搭建。 选择 Maven进行包管理,语言选择JAVA,Spring Boot 版本选择3.0.0,JDK 版本选择17。并在右侧选择自己希望的依赖。结果如下图&#xff1…

基于SpringMVC+Hibernate+Layui城市智能消防决策平台设计

开发软件:Eclipse,可以用idea,mysql数据库 开发技术:SpringMVC,Spring,Hibernate,jquery,layui 本系统的功能主要分为两个角色,其中用户的功能有:登陆注册,查看火灾案例,火警报警,查看自己的报警…

【产品经理必备文档】述职报告/年终总结汇报ppt模板

今天和大家免费分享产品必备文档模板——产品经理述职文档(年终总结汇报)的ppt模板~~~ 【文档下载】 这个ppt模板可以在下方小程序里免费下载哦 【编写教程】 个人工作年终总结一般分成4部门:个人岗位职责、工作完成情况、年度经验总结、 1…

北语、北外2022年12月公派英语统考的通知

近日,北语和北外均发布了12月29日国家公派英语高级班结业统考的通知。与以往不同的是:为无法参加12月29日统考的学员增加一次考试机会,时间定于2023年2月25日,但需要提前报名。具体报名时间及方式参见两校的通知,知识人…

17_ 数据库 _ MySQL主从同步配置

文章目录一、主从同步的定义二、使用主从同步的好处三、主从同步的机制四、配置主从同步的基本步骤五、详细配置主从同步的方法5.1 备份主服务器原有数据到从服务器5.1.1 主服务器Ubuntu上进行备份5.1.2 在从服务器Windows上进行数据还原5.2 配置主服务器master(Ubu…

单商户商城系统功能拆解48—应用中心—消息通知

单商户商城系统,也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法,例如拼团,秒杀,砍价,包邮…

JUC(九)-线程池-认识JDK中的线程池

JUC、线程池相关内容 文章目录JUC、线程池相关内容一、 什么是线程池1.1 为什么要使用线程池二、 JDK 自带的线程池2.1 newFixedThreadPool方法2.2 newSingleThreadPool方法2.3 newCachedTreadPool方法2.4 newScheduleTreadPool方法2.4.5 Executors Demo2.5 newWorkStealingTre…

搞机器学习不会线性代数?那怎么行

搞机器学习不会线性代数?那怎么行! 文章目录搞机器学习不会线性代数?那怎么行!1 直观真正理解向量2 理解向量的加法与数乘3 理解向量乘法的本质3.1 向量内积3.2 向量外积4 理解基向量与线性无关4.1 如何理解基向量4.2 如何理解线性…

刷完了这份足足485页的“1000道Java工程师面经”,成功上岸!

前言 本人18年毕业于一家普通二本,考研凉了且没有实习经验,只做过两个项目会一点SpringBoot,每天就是不断地投简历、刷面经,感觉自己都要抑郁了 最后勉强进入了一家学校合作的外包公司干了3年的CRUD,刚开始每个月拿着…

当一个人学习编程之后,带来的人生有什么新变化?

数字化迅速蔓延的世界里,拥有技术技能(特别是编程技能)可以为你提供更多更好的个人发展机会。在这里,两位半路转行的程序员给你解释了为什么任何人都应该学习编写代码。因为,学习编程既然改变了他们的生活,…

Transformers学习笔记2. HuggingFace数据集Datasets

Transformers学习笔记2. HuggingFace数据集Datasets一、简介二、操作1. 下载数据集2. 常用函数(1)排序(2)打乱顺序(3)选择函数(4)过滤(5)切分数据集&#xff…

图书管理网站

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 模块划分:老师模块、班级模块、学生模块、课程模块、试题模块、试卷模块、 组卷模块、考试模块、答题模块 管…

第十五章项目1——水果管理系统

文章目录目的从需求开始出发从数据库和数据库连接开始——DAO层对应数据库和数据表的创建项目优化——Mybatis等框架思路引入关于Servlet的编写项目优化——MVC思路引入项目优化——ViewBaseServlet模板引擎的引入项目优化——dispatcherServlet引入项目优化——Service层引入项…