响应式编程学习

响应式编程学习_第1张图片
刚注册了微信公众号,欢迎关注!

响应式编程

1. 响应式宣言

We want systems that are Responsive, Resilient, Elastic and Message Driven.

四个关键字:

  1. Responsive:即时响应性,系统尽可能及时响应。
  2. Resilient:回弹性,系统在出现故障时保持响应。通过复制,包含,隔离和委派来实现弹性。故障包含在每个组件中,使组件彼此隔离,从而确保系统的各个部分可以发生故障并可以恢复而不会损害整个系统。。
  3. Elastic:弹性,系统在不断变化的工作负载下保持响应能力。
  4. Message Driven消息驱动:响应式系统依靠异步消息传递在组件之间建立边界,以确保松耦合,隔离和位置透明。

Reactive Streams是一项倡议,旨在为具有无阻塞背压的异步流处理提供标准。

2. Reactive Streams

在 Java 平台上,Netflix(开发了 RxJava)、TypeSafe(开发了 Scala、Akka)、Pivatol(开发了 Spring、Reactor)共同制定了一个被称为 Reactive Streams 项目(规范),用于制定反应式编程相关的规范以及接口。其主要的接口有这三个:

  • Publisher
  • Subscriber
  • Subcription

Reactive Streams 的目标
The main goal of Reactive Streams is to govern the exchange of stream data across an asynchronous boundary—think passing elements on to another thread or thread-pool—while ensuring that the receiving side is not forced to buffer arbitrary amounts of data.
Reactive Streams 的主要目标是控制在异步边界流数据的交换(考虑将元素传递到另一个线程或线程池),同时确保接收方不是被迫缓冲任意数量的数据。

3. 异步编程比较

  • Futures:Java 5,利用 LockSupport#park 实现了线程等待,所以 Future#get() 会阻塞线程。
  • CompletableFuture:Java 8,用回调实现异步。除了 CompletableFuture#get() 方法之外,可使用 CompletableFuture#thenApply 等方法实现任务链,当任务完成时执行下一个任务。可参考另一篇文章 从CompletableFuture学习Dubbo 2.7.x 全链路异步。
  • Reactive Streams:看起来与 Java 8’s streams类似,但更强大。例如 RxJava 可以将一堆同步或异步的操作串联成执行链,并且提供了背压机制。

4. 总结

  1. 背压( Back Pressure ),控制数据流量大小,数据流的订阅者可以和发布者协商自己可以处理的数据量。极端情况下,发布快速流量数据会搞垮订阅者(例如消耗完内存和处理资源)。“背压”可以让发布者匹配订阅者的处理能力。
  2. Spring 认为 Reactive 和非阻塞通常并非让应用运行更快速,甚至会增加少量的处理时间,它的使用场景则利用较少的资源,提升应用的伸缩性。因为代码逻辑执行还是一致的,但 Reactive 让系统线程时刻保持运行,采用类似回调的形式通知执行下一个任务。
  3. Reactive 需要全链路实现才能发挥其能力,如果其中一环是阻塞的可能比阻塞编程更慢,现在由于 jdbc 还没有完整的 Reactive 解决方案,所以使用较少。但 Reactive 在 API 网关这类中间件使用较多(是因为 api 网关提供了 response 的回调方法嘛?马上去研究一下 zuul2 的实现)。

PS:刚学习不久,可能某些观点有问题。

参考
https://www.reactivemanifesto.org
http://www.reactive-streams.org/
https://www.jianshu.com/p/7ee89f70dfe5
http://blog.yanickxia.site/2018/06/26/java/spring/projectreactor/
https://www.jianshu.com/p/4676d0646317
https://www.jianshu.com/p/ceb48ed8719d
https://stackoverflow.com/questions/35329845/difference-between-completablefuture-future-and-rxjavas-observable

你可能感兴趣的:(Java笔记)