初识响应式系统

第一次听到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初探的更多相关文章

  1. Paip.Php Java 异步编程。推模型与拉模型。响应式(Reactive)”编程FutureData总结... 1

    Paip.Php  Java 异步编程.推模型与拉模型.响应式(Reactive)"编程FutureData总结... 1.1.1       异步调用的实现以及角色(:调用者 提货单) F ...

  2. 前端必读:Vue响应式系统大PK

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.sitepoint.com/vue-3-reactivity-system ...

  3. 前端必读:Vue响应式系统大PK(下)

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.sitepoint.com/vue-3-reactivity-system ...

  4. vue原理探索--响应式系统

    Vue.js 是一款 MVVM 框架,数据模型仅仅是普通的 JavaScript 对象,但是对这些对象进行操作时,却能影响对应视图,它的核心实现就是「响应式系统」. 首先看一下 Object.defi ...

  5. Vue 及框架响应式系统原理

    个人bolg地址 全局概览 Vue运行内部运行机制 总览图: 初始化及挂载 在 new Vue()之后. Vue 会调用 _init 函数进行初始化,也就是这里的 init 过程,它会初始化生命周期. ...

  6. Vuejs - 深入浅出响应式系统

    Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是普通的 Javascript 对象.而当你修改它们时,视图会进行更新.这使得状态管理非常简单直接,不过理解其工作原理同样非常重要,这样 ...

  7. Vue的响应式系统

    Vue的响应式系统 我们第一次使用Vue的时候,会感觉有些神奇,举个例子: <div id="app"> <div>价格:¥{{price}}</di ...

  8. 【js】vue 2.5.1 源码学习 (七) 初始化之 initState 响应式系统基本思路

    大体思路(六) 本节内容: 一.生命周期的钩子函数的实现 ==> callHook(vm , 'beforeCreate') beforeCreate 实例创建之后 事件数据还未创建 二.初始化 ...

  9. 你是如何理解Vue的响应式系统的

    1.响应式系统简述: 任何一个 Vue Component 都有一个与之对应的 Watcher 实例. Vue 的 data 上的属性会被添加 getter 和 setter 属性. 当 Vue Co ...

  10. Vue3中的响应式对象Reactive源码分析

    Vue3中的响应式对象Reactive源码分析 ReactiveEffect.js 中的 trackEffects函数 及 ReactiveEffect类 在Ref随笔中已经介绍,在本文中不做赘述 本 ...

随机推荐

  1. 程序员应具备的PS基本技能(一):PS2017基本框架使用

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  2. 项目实战:Qt编译Qt库以及使用C#调用Qt库,并实现C#集成Qt的tcp客户端

    需求   1.Qt已经开发了应用,封装成Qt库,以供C#调用.  2.Qt的tcp客户端封装,以供C#调用,双向传递数据.   原理   1.使用QtCreator编译msvc版本的Qt库:  2.使 ...

  3. 用Pandoc生成TXT格式的目录

    我一直使用Markdown格式写作,使用Pandoc生成PDF和Word格式的文档.Pandoc能生成很好的章节和目录,但有时候,也需要生成TXT格式的目录,今天就尝试了一下. 由于我写的内容章节比较 ...

  4. Python实现snap:对齐多张遥感影像的空间范围

      本文介绍基于Python中ArcPy模块,实现基于栅格图像批量裁剪栅格图像,同时对齐各个栅格图像的空间范围,统一其各自行数与列数的方法.   首先明确一下我们的需求.现有某一地区的多张栅格遥感影像 ...

  5. ui转py文件

    ui文件转py文件并且使用 简单做一个笔记,以后忘了回来看看 转换 在QT Designer中创建完ui文件后,回到pycharm中,右键点击ui文件,选择pyuic 完成后获得了和ui文件同名的py ...

  6. 10、mysql的锁

    锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢). 在数据库中,除传统的计算资源(如 CPU.RAM.I/O 等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访 ...

  7. XWAF安装遇到的坑

    存在的问题:需要的编译环境没有安装配置好的话出现下面的问题: 1.error: Microsoft Visual C++ 14.0 or greater is required. Get it wit ...

  8. sql99等值&&非等值查询

    1 #二.sql99语法 2 /* 3 语法 4 SELECT 查询列表 5 FROM 表1 别名 [连接类型] 6 JOIN 表2 别名 7 on 连接条件 8 [where 筛选条件] 9 [gr ...

  9. XAF新手入门 - 数据字典示例

    前言 通过前面文章的介绍,大家应该对模块与类型信息子系统有所了解,再通过一个示例来加深大家对它的理解. 在准备写这个系列文章之前,就准备是概念+示例的组合,这样大家对概念的理解会更深刻.之前的规划是在 ...

  10. 深入浅出Java多线程(十一):AQS

    引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十一篇内容:AQS(AbstractQueuedSynchronizer).大家觉得有用请点赞,喜欢请关注!秀才在此谢 ...