.NET培训
美国上市.NET培训机构

400-111-8989

热门课程

程序员知悉:这五大关于反应式编程的关键点!

  • 时间:2017-08-07
  • 发布:.Net培训
  • 来源:NET职场

Reactive?反应式编程?在这篇文章中,我们将讨论反应式编程,即围绕异步数据流构建的开发模型。很多程序员编写第一个反应式应用程序时都是极不耐烦的,但在做这些之前,有几件事要清楚。使用反应式编程可改变设计和编写代码的方式,在这篇文章中,我们将解释关于反应式编程的5件事情,看看对你有什么意义。

1、反应式编程是用异步数据流进行编程

使用反应式编程时,数据流将成为应用程序的脊柱。事件、消息、呼叫甚至故障都由数据流传达。使用反应式编程,程序员可观察这些数据流,并在值发生变化时作出反应。

所以,在代码中,程序员可以创建任何数据流,包括点击事件、HTTP请求、获取消息、可用性通知、变量变化、缓存事件、传感器测量值等等......这对应用程序有一个有趣的副作用:它本质上是异步的。

程序员务必知悉:这五大关于反应式编程的关键点!

Reactive eXtension (http://reactivex.io,a.ka.RX)通过使用可观察序列来组合异步和基于事件的程序反应原理的实现。使用RX,代码将会创建并订阅名为Observables的数据流。RX同时提供了一个了不起的工具箱,程序员有一个功能集合来组合、合并、过滤、转换和创建数据流。下图说明了在Java中使用RX的情况(使用https://github.com/ReactiveX/RxJava)。

程序员务必知悉:这五大关于反应式编程的关键点!

虽然RX不是唯一的反应式编程实现(例如我们可以引用BaconJS - http://baconjs.github.io),但它是今天最常用的。在这篇文章的其余部分,我们将使用Rx Java。

2、Observables 数据流的冷热很重要

程序员或许在尝试查看将在程序中处理的不同流(或可观测值)是什么样子的。但有两类流:冷和热。了解其差异是成功使用反应式编程的关键。

冷Observables数据流是懒惰的。除非有人开始使用它们,否则不会做任何事情(在RX中订阅)。它们只在消耗时才开始运行,冷流用于表示异步操作,例如,直到某人对结果感兴趣才会执行它。另一个例子是文件下载,如果没有人要对数据做某事,它不会开始提取字节。冷流产生的数据在用户之间不共享,订阅之后将获得所有的项目。

热数据流在订阅之前是活跃的,如股票行情,或传感器,或用户发送的数据。数据独立于单个用户,当程序员订阅热Observables 时,它将获得在订阅之后发出的流中的所有值。这些值在所有用户之间共享。例如,即使没有人订阅温度计,它也会测量和发布当前的温度。当用户注册流时,它会自动接收下一个值的数据。

为什么要了解你的流是热还是冷的呢?因为它会改变代码消耗传送项目的方式。如果没有订阅热流,程序员将不会收到数据,并且此数据会丢失。

3、滥用异步

反应式编程定义中有一个重要的单词:异步。当数据流以异步方式发送时,程序员将被通知——独立于主程序流。通过围绕数据流构建程序,在流发出新项目时编写调用的代码。线程,代码阻塞和副作用在这种情况下是非常重要的事情,我们从副作用开始吧。

没有副作用的函数仅通过其参数和返回值与程序的其余部分进行交互。副作用可能非常有用,在许多情况下是不可避免的,但也有陷阱。使用反应式编程时,应避免不必要的副作用,并在使用它们时有明确的意图。虽然有些情况是合理的,但滥用副作用会引发线程安全问题。

第二个重点:线程。数据流一切正常,但程序员不知道功能被执行在哪个线程上了。建议避免在程序中使用太多线程,依赖于多个线程的异步程序将成为一个艰难的同步难题,通常以死锁结尾。

第三点:避免代码阻塞。通过组合RX和异步IO,程序员可以编写非阻塞代码所需的全部内容,如果需要更多内容,请查看Eclipse Vert.x,这是一个提高反应式和异步反应式的工具包。例如,以下代码显示了Vert.x Web Client及其RX API,用于从服务器检索JSON文档并显示名称条目:

程序员务必知悉:这五大关于反应式编程的关键点!

注意在最后一个片段中的subscribe方法。当其中一个处理阶段引发异常时,需要第二种方法。要学会捕捉异常,如果不这样做,程序员可能会花几个小时来弄清楚出了什么问题。

4. 让问题简单化

RX提供了很多非常酷的功能, Chainingflapmap、重试......但是,永远不要忘记,好的代码需要具备可读性。

我们来看一些代码:

程序员务必知悉:这五大关于反应式编程的关键点!

给出一个这样的例子很难理解吗?它链接了几个异步操作(flatmap),加入了另一组操作(zip)。 反应式编程代码首先需要思考,通知异步事件。然后,API可能很难掌握(只看运算符列表)。不滥用,写注释或绘制图表。RX是强大的,滥用或不注释会使你的同事脾气暴躁。

5.反应式编程不等于反应式系统

这可能是最令人困惑的部分。使用反应式编程不会构建一个反应式系统。反应式定义的反应式系统是构建响应式分布式系统的架构风格。反应系统可以看作是正确的分布式系统,反应系统的特点是四个性质:

响应:反应式系统需要在合理的时间内处理请求(程序员要合理定义)。

弹性:反应式系统必须面对失败保持响应(崩溃,超时,错误...),因此它必须设计在故障时适当地处理bug。

伸缩:反应式系统必须在各种负载下保持响应。因此,它必须扩展和缩小,并且能够以最少的资源来处理负载。

消息驱动:来自反应式系统的组件使用异步消息传递进行交互。

尽管这些反应系统的基本原理很简单,但建立其中任何一个都是棘手的。通常,每个节点需要采用异步非阻塞开发模型,基于任务的并发模型,并使用非阻塞I / O。如果不先考虑这些问题,那么很快就会失败。

反应式编程和反应扩展提供了一个驯服异步的开发模型。明智地使用它,代码将保持可读性和可理解性。然而,使用反应式编程不会将系统转变为反应系统,反应式系统是一个新的水平。

如果对反应式系统感兴趣,可以查看Eclipse Vert.x,构建反应和分布式系统(http://vertx.io)的工具包,结合Vert.x和Reactive eXtension可以释放反应式超能力。程序员不仅可以使用反应式编程,还可以构建反应式系统,并可以访问一个令人兴奋和不断增长的生态系统。

Happy coding!

上一篇:.NET的微服务架构下的开发(测试环境运维实践)
下一篇:达内携燕京理工学院举办暑期产学研合作交流会
选择城市和中心
贵州省

广西省

海南省