响应式系统reactive system初探

初识响应式系统

第一次听到reactive这个词仍是在几年前,偶然了解到了Rxjava这个项目,仿佛为我打开了一扇新的大门,Rxjava是ReactiveX的java实现,ReactiveX家族除了Rxjava还有RxJS, Rx.NET,RxScala等等。java

ReactiveX的本质就是Observer+Iterator+函数编程+异步。是一个事件驱动的,异步的,可观察的序列。react

使用RxJava能够将异步的回调改写成为链式调用。在代码上看起来很是简洁明了。固然JDK也提供了CompletionStage提供了相似的解决回调的功能。web

更多内容请访问 www.flydean.com

Rxjava只是一个java的基本库,若是咱们想要构建响应式的服务器,响应式的web,响应式的数据访问,甚至是响应式的微服务,又该如何处理呢?spring

这个时候我了解到了Vert.x。Vert.x就是用来构建Reactive的应用程序的。编程

Vert.x是Eclipse基金会旗下的产品,基于事件驱动和非阻塞编程。api

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的博客

欢迎关注个人公众号:程序那些事,更多精彩等着您!