功能性反应式编程-类固醇上的流

功能反应式编程是一种将反应式编程与异步数据流连接并使用功能式编程的构建块的编程范例。 就像其他编程范例一样,这不是一个全新的想法。 该概念于1997年引入,但自2014年出版后述的Reactive Manifesto时开始流行。

为什么使用异步数据流?

通常,与移动,桌面或Web应用程序的交互是将整个表单提交到后端,并将视图呈现到前端。 如今,用户希望获得更实时的体验。 在搜索字段中键入一些字母后,用户希望立即看到搜索结果。 如果UI和后端应用程序之间的连续数据流持续存在,并且数据流在其中起着至关重要的作用,那么这是可行的。

通过反应式编程,可以从任何内容创建数据流。

发出的数据被异步捕获,并由定义的函数处理。 您还可以在发出错误时定义另一个函数,并在流完成时定义另一个函数。 有时可以省略最后两个,而您可以专注于为值定义函数。

对流的“监听”称为订阅。 我们定义的功能是观察者 。 流是观察到的。 这正是观察者设计模式

为什么要进行函数式编程?

函数式编程提高了代码的抽象水平,因此您可以专注于定义业务逻辑的事件的相互依赖性,而不必不断地摆弄大量实现细节,这些细节现在已隐藏在流的下面。 函数式编程还带来了一个奇妙的函数工具箱,用于组合,创建,映射和过滤任何数据流。

反应性宣言

根据宣言,反应系统是

  • 反应迅速:系统尽可能准时响应。 响应能力也意味着可以快速发现问题并进行有效处理。
  • 弹性:系统在发生故障的情况下仍保持响应能力 ,每个组件之间都包含故障,将组件彼此隔离。
  • 弹性:系统在不断变化的工作负载下保持响应能力,反应性系统可以通过增加或减少分配给服务的资源来响应输入速率的变化。
  • 消息驱动:依靠异步消息传递在组件之间建立边界,以确保松散耦合,隔离和位置透明。

因此,反应性系统更加灵活,松耦合且可扩展。 这使它们更易于开发并允许更改。 他们对失败的容忍度更高,当确实发生失败时,他们会优雅地面对而不是灾难。

我什至还要关心吗?

典型的服务器端应用程序是根据命令的后续调用以命令式方式开发的,这些操作随后被放在调用堆栈上。 调用堆栈的主要功能是跟踪给定例程的调用者,在阻塞进程中的调用者的同时执行调用的例程,并通过返回值将控制权返回给调用者。

对于事件驱动的应用程序,调用堆栈不是主要问题。 主要关注点是由发布者触发事件并由观察者监视事件流。 事件驱动和命令式样式之间的最大区别是,调用者在等待响应时不会阻塞并保持线程。

事件循环本身可以是单线程的,但是在被调用的例程处理其业务(并可能阻塞IO本身)的同时,仍然可以实现并发,同时允许(有时是单线程)线程事件循环处理传入的请求。

举个例子,让我们来看一个耗时的过程,例如在大数据集中搜索,将整个响应作为一个批处理返回。 但是,如何在找到项目之后立即携带物品呢,如下例所示。 记录存储在MongoDB中的一个大集合中,因此搜索包含短语的项目会花费一些时间。 为了增加用户体验,记录会在屏幕上依次显示,而无需等待整个操作完成。

要实现上述效果,您需要使用服务器发送事件(SSE)。 产生电影流的API代码非常简单。 只需注意响应媒体类型TEXT_EVENT_STREAM

梦想是编写一个不依赖于遗留数据库或遗留API的全新应用程序。 在Nexocode,我们从头开始开发新项目。 在可能的情况下,我们使用Reactive Mongo(Spring Data支持MongoDB,Apache Cassandra和Redis)和WebClient进行网络通信,从而实现从上到下的Reactive编程方法。 尽管如此,我们仍必须与外部API通信。

幸运的是,也有解决方案。 响应式库无需等待外部API调用完成,而是提供了一组包装器,这些包装器可以在阻塞事件上创建流。 这不是一个完美的解决方案,因为它需要等待请求完成,因此它不允许进行流处理,但是至少不会阻塞调用方的线程,这会减少计算量。

通常,我觉得我使用响应式方法而不是命令式方法来编写更有效,更易读的代码,但是响应式编程也可能有一些缺点。

首先,这种范例会增加内存开销,因为它大部分时间都需要存储不可变的数据流。

对于开发人员来说,由于不同的编程范例,它需要付出一些努力来改变思维方式,这也没有像最受欢迎的面向对象编程那样被彻底描述。

对我来说,最大的缺点是在开发过程中调试会更加复杂,因为您不仅需要调试实现,而且还需要注意正确使用流API。 此外,您的实现由流API封装。

以上所有内容都刮伤了开发反应性应用程序的表面。 似乎响应式编程不仅是另一种趋势,还是现代软件开发的范例,它鼓励编写高效且易读的软件,从而将用户体验带入新的高度。

无论您选择哪种语言或工具包,将可扩展性和弹性放在首位以实现响应能力是满足用户期望的唯一方法。 随着时间的流逝,这只会变得越来越重要。


最初于 2018 年7月4日 发布在 www.nexocode.com 上。