【Scala】响应式编程思想

何为响应式编程

响应式编程是一种面向数据流和变化传播的编程范式,数据更新是相关联的。 这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
以响应式编程方式进行思考,意味着要放弃命令式且带状态的编程习惯,并且强迫你的大脑以一种不同的方式去工作。
响应式编程提高了代码的抽象层级,所以你可以只关注定义了业务逻辑的那些相互依赖的事件,而非纠缠于大量的实现细节。它可以简化项目,特别是处理嵌套回调的异步事件、复杂的列表过滤和变换,或时间相关问题。

交互式编程与响应式编程

平时我们使用最多的便是“交互式(Interactive)”的编程方式,采用的是组件之间的相互调用来表现逻辑。例如,对象A向对象B请求数据并等待返回,待对象B完成并返还数据之后A才继续进行后面的操作。
响应式编程是一种基于“改变”的编程方式。例如在交互式编程中,A = B + C这样的表达式意味着将B与C之和赋给A,而此后B与C的改变都与A无关。而在响应式编程中,A会去“响应”B或C的变化,即一旦B或C改变之后,A的值也会随之变化。响应式编程的一个典型应用便是GoF23中的观察者模式。

响应式系统模型

Actor模型

Actor模型=数据+行为+消息。Actor模型内部的状态由自己的行为维护,外部线程不能直接调用对象的行为,必须通过消息才能激发行为,这样就保证Actor内部数据只有被自己修改。
Actor是一个个独立的实体,他们之间是毫无关联的。但是,他们可以通过消息来通信。一个Actor收到其他Actor的信息后,它可以根据需要作出各种相应。Actor的常见应用模式是处理大规模并发输入流:将具体工作分类给异步的工作节点,之后返回工作节点计算的结果。
Actor模型实际上并不是纯正的函数式编程模型。Receive方法返回Unit类型,这意味着在该方法中,所有事情都是通过副作用完成的。再者,只要需要,Actor模型便会允许使用可变状态,但这里要遵守一个规则,将状态封装在某个actor中,并确保所有状态的响应操作是线程安全的。
综上,Actor模型是处理大规模、高度可用、事件驱动应用程序的更为通用的方法。

函数响应式编程(functional reactive programming,FRP)

在函数响应式编程模型中,基于时间的状态需要通过某一系统传播到需要使用这些状态的代码中。当FRP模型中的某一状态发生变化时,你并不需要手动地对依赖这些变化的变量进行更新,与之相反,FRP会使用声明的方式描述数据元素之间的依赖关系,而FRP运行时则会负责状态的传播。因此,用户使用函数式声明语句和组合语法编写代码。

FRP基本上就是面向异步事件流的编程了,这个异步事件流(Stream)是一个按时间排序的事件序列。Stream是不可变的,任何操作都返回新的Stream,且它是一个Monad。

响应式扩展(reactive extensions,Rx)

Reactive Extension 这个概念最早出现在.net社区的Rx.net,一个提供处理异步事件的程序库,其核心概念是Observable,表示有限或者无限多个现在或者将来到达的事件。Observable提供了onNext,onError,onCompleted供开发者定制新元素到达,出现错误,或者流结束时的程序的行为。并提供了List上类似的操作,如map,filter,reduce,大大降低了异步事件编程的复杂度。
因为这些概念是如此的强大,以至于很多编程语言,如java,ruby,javascript很快就有了各自的reactvie extension。

Rx模型中的可观察序列代表事件流或其他数据源。通过将可观察序列与LINQ(language-integrated query,语言集成查询)库提供的查询操作符(组合器)拼接起来,Rx组成了异步程序。

小结

Actor、FRP以及Rx都是基于事件的系统模型。FRP和Rx模型更像是一个处理各类事件流的管道系统,而Actor模型则像是一个包装各个组件进行交互的网络系统。尽管略有差异,但是这些模型都能够通过多种方式进行扩展。有一点可以断言,Actor模型健壮的错误处理策略,使得它对响应性提供的支持称为最强的支持。值得一提的是,尽管这些模型提高系统响应度的方式不同,但所有模型都致力于最大程度地减少阻塞。

响应式系统须遵循的特征

所有可伸缩、可恢复的响应式程序都应遵循这些特征。

消息传递或事件传递

响应式系统必须能对消息或事件进行响应,这是最基本的要求。

可灵活伸缩

为了能够满足处理要求,响应式系统是可伸缩的系统。这意味着该系统能够通过水平扩展的方式进行扩容、调整进程数、处理核数、处理节点数。理想状态下,为了能够动态响应不停变化的处理需求,系统应该根据当前需求动态的执行水平扩展,这种调整既包括增加处理资源,也包括自动回收资源。用这种方法,我们需要花费大量的精力才能对那些需要维护重要状态信息的服务进行横向扩展,而且这类系统也很难对状态信息进行“分片”和可靠的复制。

容错可恢复

随着系统不断变大,那些不常见的事件也会越来越频繁地出现在系统中。因此,错误也是需要考虑的头等大事。构造响应式系统时,必须不断进行改造,以便能够在出现错误时优雅地恢复系统。所以常常需要弱耦合和通用的监督系统的设计。

响应式

响应式系统需要能够随时对服务请求进行响应,即使系统出现了错误的组件或是精力了非常高的流量峰值,响应式也需要通过优雅降级的方式继续响应用户的请求。

总结

本节中给出了响应式编程的基本概念,讨论了响应式系统模型和所遵循的特征。由于该方面的相关资料较为混乱,使得我在学习过程中难以把握一些概念的定界,待日后勤加实践,从Scala的并发系统和akka框架入手,加深对响应式编程的理解。

转载请注明作者Jason Ding及其出处
jasonding.top
Github博客主页(http://blog.jasonding.top/)
CSDN博客(http://blog.csdn.net/jasonding1354)
简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
Google搜索jasonding1354进入我的博客主页

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 随着前端框架react,angular以及vue的流行,响应式编程也开始在前端领域得以广泛应用。因此,了解并且理解...
    SCQ000阅读 7,391评论 1 53
  • Actor系统的实体 在Actor系统中,actor之间具有树形的监管结构,并且actor可以跨多个网络节点进行透...
    JasonDing阅读 3,277评论 2 6
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,568评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 碧空万里无片云, 蓝黛骄阳罩山阴。 猛暑炎日高温季, 昼伏夜出方智明。
    明哥明说阅读 224评论 3 1