响应式系统reactive system初探
初识响应式系统
第一次听到reactive这个词还是在几年前,偶然了解到了Rxjava这个项目,仿佛为我打开了一扇新的大门,Rxjava是ReactiveX的java实现,ReactiveX家族除了Rxjava还有RxJS, Rx.NET,RxScala等等。
ReactiveX的本质就是Observer+Iterator+函数编程+异步。是一个事件驱动的,异步的,可观察的序列。

使用RxJava可以将异步的回调改写成为链式调用。在代码上看起来非常简洁明了。当然JDK也提供了CompletionStage提供了类似的解决回调的功能。
更多内容请访问www.flydean.com
Rxjava只是一个java的基本库,如果我们想要构建响应式的服务器,响应式的web,响应式的数据访问,甚至是响应式的微服务,又该如何处理呢?
这个时候我了解到了Vert.x。Vert.x就是用来构建Reactive的应用程序的。

Vert.x是Eclipse基金会旗下的产品,基于事件驱动和非阻塞编程。
Vert.x是模块化的,里面有Core,web,Data access,Reactive,Microservices,MQTT,Authentication and Authorisation,Messaging,Event bus Bridge,Devops,Testing,Clustering,Services和Cloud等模块。可谓是应有尽有。
其实java界一直都在向reactive靠近,除了JDK本身的api新特性意外,比如业界有名的Spring也在spring 5中添加了webflux框架,这就是一款reactive的web框架。
什么是响应式系统
在上一节我们提到了Rxjava和Vert.x,里面有一些共同的关键字,比如异步,事件驱动,观察者模式,函数式编程,消息驱动等,所有的一切都是为了让现代系统更加健壮,运行的更快,更加富有弹性,从而更好。
系统从很久之前的单一服务器,到现在的多服务器架构,从秒级响应到现在的毫秒级响应。从90%可用都现在的99.999%可用。不论从系统设计,架构还是程序编码都发生了极大的变化。
我们迫切的需要一个能够满足以上需求的通用的系统架构解决方案。
那么什么是响应式系统呢?
响应式系统需要具备这些特征:及时响应性(Responsive)、恢复性(Resilient)、有弹性(Elastic)以及消息驱动(Message Driven)。我们把具有上面四个特性的系统就叫做响应式系统。
上面的四个特性中,及时响应性(Responsive)是系统最终要达到的目标,恢复性(Resilient)和有弹性(Elastic)是系统的表现形式,而消息驱动(Message Driven)则是系统构建的手段。
于是我们得到了响应式系统的终极架构图:

使用响应式系统的架构,可以保证系统的可维护性,和可扩展性,并且在系统出现问题的时候能够有更好的可容忍性。
响应式系统的四大特点
在定义响应式系统的时候,我们提到了及时响应性(Responsive)、恢复性(Resilient)、有弹性(Elastic)以及消息驱动(Message Driven)这四大特点。
接下来我们将会具体描述这四大特点到底有什么奥秘。
及时响应性(Responsive)
Responsive就是系统能够立刻响应请求,这应该包含两个方面的含义。
第一,响应请求的时间要够短,如果用户请求一个页面,等待2秒钟估计已经是极限了。再长的时间估计就要失去这个用户了。
时代在变,技术也在变,十几年前下载一个几百K的文件要一分钟估计就算是很快了,现在没有个几M每秒,肯定会让人抓狂不已。
在现代CPU,服务集群和光纤传输的飞速发展和页面承载信息的巨大变化,一个普通的页面可能就要包含十几二十个请求。每个请求的时间已经提升到了毫秒甚至是微妙级。同时在页面展示方面也产生了很多新的变化,比如异步加载和预加载等技术。
最终是为了创建一个能够及时响应的系统。而系统背后的各种技术和新的请求方式都是为这个目标来服务的。
第二,对于错误的响应时间要短。
一方面对于用户来说,要及时的提醒用户可能出现的错误。不管是系统本身的错误亦或是用户的使用错误,都需要在一个有限的时间内进行响应。
另一方面,对于系统本身来说,要能够快速的定位和响应问题。这是提升系统本身的稳定性和安全性的基本要求。
如何发现和响应系统本身的问题呢?第一要有完善的错误记录系统,让一切都有章可循。第二就是要有相应的监控措施,让系统出现的任何问题都能够及时的进行通知和报警。
恢复性(Resilient)
可恢复性是指系统在遇到失败或者错误时仍然能够对外提供服务。
首先,要求我们的系统足够稳健,能够抗住正常的访问,并且能够可预见的应对热点访问。
其次,现代系统的功能是各种各样的,一个简单的APP的后台可能有多达几十种服务。所以我们需要区分出来哪些是关键的服务,哪些是非关键的服务。对于关键的服务我们一定要确保其的稳定性,对于非关键性的服务,我们可以在首先保障关键服务的前提下再进行考虑。
比如说一个订单系统,下单肯定就是关键服务了,而商品的点赞数,评论等则就没有那么重要。
区分好了关键服务和非关键服务,就要对他们进行区分和隔离。非关键服务的任何错误或者异常都不能够影响到关键服务。
再次,如果服务发送了错误,我们应该尽可能的缩小影响范围,不要一点小错误影响所有的服务。
最后,对于失败要有恢复措施,并且这个恢复措施不能够影响其他的系统服务。比如我们可以对现有的系统做一个复制,在某个服务失败的时候,可以用备用的服务进行替代。
只有这样,才能够保证系统的可靠性。
有弹性(Elastic)
弹性的意思就是在需要的时候服务可以动态扩展,在不需要的时候可以停用服务以节约资源。
现在很多云服务都提供了动态扩展的功能,如果系统是我们自己实现的,那就需要区分出热点问题和非热点问题。
只有热点问题才需要考虑弹性,系统不能有瓶颈,并且能够进行分片或者复制,从而实现分布式的动态负载功能。
负载均衡技术可能是我们最常用的弹性功能,但是如何动态的自动的进行负载的均衡可能是一个非常有意义的话题。
弹性可以通过软件或者硬件的方式来实现,当然我们需要在成本和效果之间达成一个平衡。
消息驱动(Message Driven)
消息驱动的本质就是发送消息,接收消息然后进行处理。现在大型系统很少有不使用消息中间件的。使用这些消息中间件的好处就是可以解耦和异步驱动。
异步的好处这里就不多讲了,大概就是不用一直傻傻的等待,而是充分利用时间去做更有效率的事情。
解耦的作用就更大了,现代系统基本上都是由很多个服务组成的。要想保证这么多系统的平稳运行,肯定要做解耦操作,否则一个服务的失败就会导致所有服务的不可用,想想都觉得害怕。
而消息驱动,就是这些不同的服务组件之间沟通的桥梁。告诉他们要做什么,等待他们的反馈消息。
或者我们可以把这些服务看做一个一个的人,多人之间的沟通就是通过语言。语言驱动或者也可以叫做消息驱动。
这里再讲一个消息驱动中常见的一个概念:back-pressure。
我们知道发送消息和接收消息的服务其处理速度是有限的,当发送消息的速度快过与接收消息的速度时候,就会发送消息阻塞,当消息阻塞过多的时候,就有可能发送消息丢失或者服务崩溃的情况。并且如果太多消息一直都没有被处理,没有得到响应的话,对于用户体验也是非常不好的。
这里就需要使用到back-pressure的概念,如果消息接收方消息处理不过来,则可以通知消息发送方,告知其正在承受压力,需要降低负载。back-pressure是一种消息反馈机制,从而使系统得以优雅地响应负载, 而不是在负载下崩溃。
总结
reactive是近几年非常流行的一个概念,如何通过reactive来设计出满足我们需要的系统,是我们需要考虑的问题。
本文作者:flydean程序那些事
本文链接:http://www.flydean.com/reactive-system-overview/
本文来源:flydean的博客
欢迎关注我的公众号:程序那些事,更多精彩等着您!
响应式系统reactive system初探的更多相关文章
- Paip.Php Java 异步编程。推模型与拉模型。响应式(Reactive)”编程FutureData总结... 1
Paip.Php Java 异步编程.推模型与拉模型.响应式(Reactive)"编程FutureData总结... 1.1.1 异步调用的实现以及角色(:调用者 提货单) F ...
- 前端必读:Vue响应式系统大PK
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.sitepoint.com/vue-3-reactivity-system ...
- 前端必读:Vue响应式系统大PK(下)
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.sitepoint.com/vue-3-reactivity-system ...
- vue原理探索--响应式系统
Vue.js 是一款 MVVM 框架,数据模型仅仅是普通的 JavaScript 对象,但是对这些对象进行操作时,却能影响对应视图,它的核心实现就是「响应式系统」. 首先看一下 Object.defi ...
- Vue 及框架响应式系统原理
个人bolg地址 全局概览 Vue运行内部运行机制 总览图: 初始化及挂载 在 new Vue()之后. Vue 会调用 _init 函数进行初始化,也就是这里的 init 过程,它会初始化生命周期. ...
- Vuejs - 深入浅出响应式系统
Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是普通的 Javascript 对象.而当你修改它们时,视图会进行更新.这使得状态管理非常简单直接,不过理解其工作原理同样非常重要,这样 ...
- Vue的响应式系统
Vue的响应式系统 我们第一次使用Vue的时候,会感觉有些神奇,举个例子: <div id="app"> <div>价格:¥{{price}}</di ...
- 【js】vue 2.5.1 源码学习 (七) 初始化之 initState 响应式系统基本思路
大体思路(六) 本节内容: 一.生命周期的钩子函数的实现 ==> callHook(vm , 'beforeCreate') beforeCreate 实例创建之后 事件数据还未创建 二.初始化 ...
- 你是如何理解Vue的响应式系统的
1.响应式系统简述: 任何一个 Vue Component 都有一个与之对应的 Watcher 实例. Vue 的 data 上的属性会被添加 getter 和 setter 属性. 当 Vue Co ...
- Vue3中的响应式对象Reactive源码分析
Vue3中的响应式对象Reactive源码分析 ReactiveEffect.js 中的 trackEffects函数 及 ReactiveEffect类 在Ref随笔中已经介绍,在本文中不做赘述 本 ...
随机推荐
- flutter打包android的一些配置修改(解决白屏,视频闪退)
1.打包后视频播放闪退 视频播放器选择了flutter_tencentplayer(https://github.com/qq326646683/flutter_tencentplayer) 解决:不 ...
- ABP的版本升级,从7.2.2升级到7.2.3
1.升级ABP CLI 见前面的文章:ABP开发需要用到的命令 更新最新版本: ~~~ dotnet tool update -g Volo.Abp.Cli ~~~ 2.升级ABP Suite 见前面 ...
- 如何提高UI自动化稳定性?
1尽量使用相对路径的xpath表达式定位元素 2查找元素优先使用显示等待方式 3用例与用例之间避免产生依赖,用例可以单独运行 4用例执行结束之后要对测试场景进行还原,避免影响到其他用例的执行 5脚本执 ...
- GPT Prompt
GPT Prompt 本文总结我关于GPT prompt的一些常用模板和资源. 我常用的模板 大致模板:你是一个怎样的人,我的场景是什么,我想要什么,你需要做什么. 比如: 你是一个经验丰富的前端开发 ...
- MVC阶段所有框架完整组合示例
思路:创建工程,导包.编辑配置文件包括 核心spring配置 SpringConfig myBatis 配置文件 mybatisConfig JdbcConfig jdbc.properti ...
- Python面向对象之多态和鸭子类型
[一]多态 [1]什么是多态 多态指的是一类事物有多种形态 [2]示例 比如动物有多种形态:猫.狗.猪 import abc class Animal(metaclass=abc.ABCMeta): ...
- JS2-DOM
API和Web API API 应用程序编程接口,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,且又无需访问源码,或理解内部工作机制的细节 API是给程序员提供的一种工具,以便能 ...
- ncc - koa 后台源码加密打包工具 @vercel/ncc - webpack node打包更正规
加个重点 webpack 打包更正规 安装 npm i -g @vercel/ncc 又发现一个 https://github.com/zeit/ncc npm i -g @zeit/ncc 卸载之前 ...
- reciterdoc 资料库 支持中文搜索了。 vuepress-plugin-fulltext-search(用一半)
http://pengchenggang.gitee.io/reciterdoc/ 支持中文搜索了,可是不容易了 通过插件 vuepress-plugin-fulltext-search 实现全文搜索 ...
- C++统计代码运行时间
本来想自己写的,一看github上面都有就不再重复造轮子了.github上的项目如下: StopWatch 纯标准库实现:使用std::chrono::high_resolution_clock,其实 ...