前言:

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

传统的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会共享线程,这些线程不会有任何的阻塞。

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

  1. RXJava2响应式编程框架设计三---Rxjava2背压、生命周期

    在上一次https://www.cnblogs.com/webor2006/p/12348890.html中已经完成了对RxJava2的整个线程切换原理的详细剖析了,这次继续来学习它其它比较重要的知识 ...

  2. 关于java的响应式编程框架----SpringReactor

    关于Reactor的介绍 Reactor是Spring中的一个子项目是一个基于java的响应式编程框架,此框架是 Pivotal 公司(开发 Spring 等技术的公司)开发的,实现了 Reactiv ...

  3. 基于单片机步进电机ppt答辩_基于单片机的步进电机式汽车仪表的设计(含电路原理图,程序)...

    基于单片机的步进电机式汽车仪表的设计(含电路原理图,程序)(课题申报表,任务书,开题报告,中期检查表,外文翻译,论文21000字,程序,答辩PPT) 摘 要 汽车仪表是驾驶者和汽车的交互界面,为驾驶员 ...

  4. 【Unity3D插件】UniRx(基于Unity的响应式编程框架)插件学习

    一.介绍UniRx插件 UniRx是一种基于Unity3D的响应式编程框架. UniRx就是Unity版本的Rx响应式扩展,响应式就是观察者和定时器,扩展指的是LINQ的操作符.Rx响应式扩展的特点就 ...

  5. 【Unity3D插件】UniRx(基于Unity的响应式编程框架)插件教程

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  6. 响应式编程框架ReactiveCocoa介绍与入门

    ReactiveCocoa是Github团队开发的第三方函数式响应式编程框架,在目前市面上的很多iOS App都大量使用了这个框架.以下我简称这个框架为RAC.我下面会通过几篇博客来和大家一起学习这个 ...

  7. 响应式编程框架ReactiveCocoa学习——框架概览

    这篇博客将会继续翻译RAC的官方文档Framework Overview. 主要是对RAC这和框架进行概览的介绍和学习.同时也可以参考我前面的两篇翻译<响应式编程框架ReactiveCocoa学 ...

  8. iOS 高大上函数响应式编程框架ReactiveCocoa学习笔记1 简介

    ReactiveCocoa函数响应式编程 一.简介 ReactiveCocoa(其简称为RAC)是函数响应式编程框架.RAC具有函数式编程和响应式编程的特性.它主要吸取了.Net的 Reactive ...

  9. [课程设计]Scrum 2.5 多鱼点餐系统开发进度(下单一览页面-菜式添加框架设计)

    Scrum 2.5 多鱼点餐系统开发进度  (下单一览页面-菜式添加框架设计) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题 ...

最新文章

  1. ASP.NET常见错误,原因及解决方法(2003版)_不断更新.....
  2. 有谁还不会找技能Call跟我来(以打坐为例子)
  3. python 字符串去重从小到大排列_110道题整理(1-60)
  4. SAP Fiori Elements里Edit按钮点击之后的后台实现
  5. KlayGE的Virtual Texturing技术定名
  6. git中使用fork
  7. Java之Integer源码
  8. er图转换成关系模型的例题,将ER图转换为关系模型
  9. leetcode题解136-只出现一次的数字
  10. java私有方法单元测试_如何通过java反射的方式对java私有方法进行单元测试
  11. ubuntu编译运行xv6
  12. cmd批处理常用符号详解
  13. ESRI大赛三维模块介绍
  14. mysql order by file_深聊MySQL,从入门到入坟之:如何让order by、group by查询速度飞起来...
  15. 阿里巴巴国际站店铺类目对运营的影响
  16. 先验分布,后验分布,似然函数
  17. dwz系列之三--分页
  18. 安卓虚拟键盘_安卓这些年变化多惊人?老玩家的回忆杀
  19. ubuntu安装QT5.14.2:编译项目报错、不能输入中文解决
  20. 电脑上有哪些剪辑音乐的软件

热门文章

  1. 华硕win10U盘重装系统进入pe
  2. python绘制蚊香形_Python requests发送post请求的一些疑点
  3. C语言基础:最简单的程序
  4. 不用第三方之C#实现大容量报表系统(转)
  5. 熊掌号PHP,百度熊掌号广受站长关注,phpcm网站程序的熊掌号页面改造插件
  6. python plot坐标轴显示比例一致,Matplotlib-固定x轴比例和自动缩放y轴
  7. Google advertiser api开发概述
  8. 下载了免费的epub电子书,如何用Windows电脑打开?
  9. 渗透测试之SQL注入基础
  10. 服务器遇到攻击了,有什么好的安全解决方案