关于Reactive Programming(一)

写在前面

由于最近学习Spring Reactor,写一些Reactive编程概念
(与之相对的是Proactive,同步、轮询。)

响应式编程已经不是一个新东西了,它其实是一个很泛泛的概念。很抽象,在不同的语言框架实现上也会侧重实现一些不同的概念。
那么按照百度词条:

响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。 ----百度词条

按照他的理解,reactive programming就是一种面向数据流,关注变更的声明式编程。面向数据流很好理解,而关注变更应该是数据流的特点,比如前端某个元素的变化,后端某个对象的变化。
来一个简单的小例子:

c = a + b;

这段代码定义了c是a与b的合,那么一次执行过程中c的值是固定的(假设a与b的值是确定的)
那么a与b的值如果不是固定的呢?这段代码只是定义了a,b,c之间的关系,那么c就是可变的对吗。
所以,当a,b出现变化的时候,c要及时响应来保证准确性。
这应该就是响应式编程的由来了,随着a,b的不断变化,会形成持续不断的事件流。
reactive在处理事件流的时候,通常是以异步通知的方式来完成,所以异步是他的重要特征。
观察现有的响应式编程框架,下面的定义更贴切一些:
Reactive编程是面向流的,异步的编程方式

面向流的设计

有别于面向对象的编程思想,在Reactive里,所有的东西都可以当作流。
Everything is Stream。Stream作为基本元素,与其他几种编程方式十分的类似

  • 面向对象设计,对象
  • 面向函数设计,函数
  • 响应式设计,流..

经典的例子就是MVC(Model-View-Controller),关于它不多赘述,可以看《The introduction to Reactive Programming you've been missing》的原文

异步

异步是响应式编程的重要特征,这里的异步与常说的网络io异步的意思是相同的,相对的概念是同步。
他俩的区别在于结果通知的方式不同,很明显,异步更加高效,所以响应式编程更多采用异步回调的方式去做,我们仅需关注回调方法中的具体实现就可以了。
ps:关于同步异步往往会牵扯到阻塞与非阻塞的概念,需要注意的是它与异步的侧重点不同,阻塞与非阻塞关注的是调用者的状态是否可以停下来做其他事。

写在后面

有兴趣的同学可以关注一下响应式宣言,它是由 Lightbend 公司发起的。在宣言里对响应式系统定义了几个特性

  • 及时响应(Responsive):系统能及时的响应请求。
  • 有韧性(Resilient):系统在出现异常时仍然可以响应,即支持容错。
  • 有弹性(Elastic):在不同的负载下,系统可弹性伸缩来保证运行。
  • 消息驱动(Message Driven):不同组件之间使用异步消息传递来进行交互,并确保松耦合及相互隔离。

但是在这几条特性里都跟响应式的流有着扯不断的关系,于是乎就在2013年有了响应式流规范。。。

实质上, Reactive响应式始终是一种模式,只是在不同的框架中混乱的概念让人很头疼。。。光是 Java里的 RxJava、Reactor、jdk 9 里的接口概念就有很多差异,更不用说跨语言了。

你可能感兴趣的:(关于Reactive Programming(一))