带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(1)

简介: 带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(1)

响应式编程的复杂度和简化

image.pngimage.png作者:蒋文豪(四点) 出品:大淘宝技术

 

 

响应式系统不是今天的主题,我们要讨论更具体的话题,即响应式代码的编写会有哪些复杂度,应该如何简化。

 

什么是响应式编程

 

什么是响应式编程,它是一种编程范式?还是一种设计模式?抑或是其他?响应式系统和响应式编程有什么关系? 又比如,响应式编程它适用于什么场景?解决什么问题?

 

微软于2011年率先建设了.Net上的Rx库,以简化容易出错的异步和事件驱动编程,迈出了响应式编程的第一步,随后业界为许多编程语言提供了对应的实现。

 

.Net上的Rx库地址https://docs.microsoft.com/en-us/previous-versions/ dotnet/re - active-extensions/hh242985(v=vs.103)

 

什么是响应式,我们从一个例子开始

image.png

 

在上面的表格中,建立了单元格之间的关系:`A1 = B1 + C1`,建立关系之后A1将响应任何对于B1和C1的变化,毫无疑问,这就是一种响应式行为。

 

我觉得这个例子很棒的地方在于,它显然很简单,同时又足够深刻,首先,它充分的体现了响应式的概念,其次, 变化发生时,肯定触发了某些过程的执行,说明背后存在关系的建立和沿着关系传播的变化,再次,稍微深入一点看,B1和C1的变化可以是一系列的变化,可以很自然的引申到流的概念,最后,它有一个很高级的抽象,对使用方来说,整个过程是声明式的。

 

当然,举例子来说明一个概念的时候,本质上是用一个外延在解释一个概念的内涵,往往是会将内涵缩小的,所以我们可以尝试推广这个外延。列出这个例子的特征:

 

 

 

描述了一个单元格里的整数等于另外两个单元格里整数相加,当后者每次发生变化时,变化都会传播到第一个单元格,并进行求值。

 

关键词为整数、等于、相加、变化、每次、传播、求值。前三个关键词仅仅和例子相关,可以直接去掉。变化可以推广为数据,每次可以在逻辑上等价于流的概念,流可以有0个、1个或多个数据,传播可以推广为通信(在这个意义上,函数调用、RPC、socket、MQ都是通信),求值推广为执行一个过程。所以我们可以得出响应式编程的定  义:

 

通过声明式的通信定义,将数据流与过程组合起来,从而实现数据驱动过程的一种复合编程范式。

 

时至今日,业界对于响应式的定义仍然是不统一的,因此这是我自己的理解。响应式的基础概念是数据流,理念是过程的执行是通过响应数据来驱动的,核心是构造数据和过程的响应关系,并且能够让数据沿着关系传播驱动过程,因此响应式编程本质上是一种对通信的抽象,说它是一种编程范式,是因为它提供一种对于数据与过程组合方式的看法,说它是复合范式而不是基本范式,是因为它不像OOP或者FP一样提供的是对于数据和过程的看法,而 是以两者为基础,所以可以有对象响应式和函数响应式。

 

当我们基于响应式构建系统时,就是响应式系统,响应式系统的构建原则可以参考此处(地址:https://www.re-activeprinciples.org/patterns/communicate-facts.html),总的来说,系统会分割成一个一个的分区,分区内部对状态进行本地化,分区之间通过通信进行异步解耦,可以通过控制这个通信的过程,实现系统的弹性扩缩容和部分组件失败的回弹性。

 

响应式系统不是今天的主题,我们要讨论更具体的话题,即响应式代码的编写会有哪些复杂度,应该如何简化。

 

带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(2)https://developer.aliyun.com/article/1339638?groupCode=taobaotech

相关文章
|
缓存 API 开发工具
带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(2)
带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(3)
110 0
|
Swift
带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(5)
带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(5)
103 0
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(4)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(4)
116 0
|
安全
带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(4)
带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(4)
109 0
|
算法
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(3)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(3)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(6)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(6)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(5)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(5)
117 1
|
SQL 缓存 JSON
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(1)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(1)
167 1
|
网络协议
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(2)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(2)
135 1
|
安全
带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(2)
带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(2)
带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(2)