天天看點

Reactor響應式程式設計 之 簡介

1 reactor 出現的背景、初衷和要達到什麼樣的目标

Reactor 項目始于 2012 年。 經過長時間的内部孵化,于 2013 年釋出 Reactor 1.x 版本。 Reactor 1 在各種架構下都能成功部署,包括開源的(如 Meltdown)和商業的(如 Pivotal RTI)。2014年,通過與一些新興的響應式資料流規範合作,重新設計并于 2015 年 4 月釋出 Reactor 2.0 版本。

1.1 阻塞浪費資源

網際網路企業基本上都有着大量的使用者,即使當代硬體的性能已經提升了很多,但是性能問題一直是網際網路企業不能忽略的一個問題。通常有兩種方式來提升應用的性能:

  • 使用更多的線程和硬體資源達到并行化。這也是很多企業采用的方式;
  • 在目前使用的資源上尋求更高效的處理。這在全球經濟下行的背景下,是一種成本更低的方式;

1.2 異步能拯救一切嘛?

通過編寫異步非阻塞的代碼,可以将執行切換到使用了相同底層資源的另一活動任務上,然後在異步完成之後傳回到目前任務。提升資源使用率。

java 提供了兩種編寫異步(異步不一定非阻塞)代碼的方式。

  • Callbacks:不立即傳回對象,但是提供了一個 callback 參數,當結果可傳回時調用。
  • Future:這也是現在大部分程式員在使用的方式。異步方法會立即傳回一個 Future。Future 對象對擷取該值進行了包裝,這個對象可以一直輪詢知道傳回(除非設定了逾時時間)。例如,ExecutorService 使用 Future 對象執行 Callable 任務。

這些技術都有自己的問題:

callback 不好組合,編寫有難度,且很容易導緻代碼難以閱讀和維護。

Future 比callback好很多,但是也有自己的問題。

  • 調用 get() 方法會阻塞;
  • 缺乏對多值和進階錯誤處理的支援。

1.3 從指令式到響應式

作為響應式程式設計方向上的第一步,Microsoft在.NET生态中建立了響應式(Rx)擴充庫。然後RxJava實作了JVM上的響應式程式設計。随着時間的推移,通過Reactive Streams的努力,一套基于JVM為響應式庫定義接口與互動規則的标準規範​

​Reactive Streams​

​ 出現了。其接口已經內建到了Java9中的 Flow 類下。

響應式旨在解決上述 JVM 提供的異步方式的缺點,同時關注了其他一些方面:

  • 組合型和易讀性
  • 資料作為 流 操作,有着豐富的操作符
  • 在訂閱之前什麼都不會發生(有什麼優點?)
  • 背壓,消費者可以向生産者發送信号表示釋出速率太快
  • 與并發無關的高階抽象

reactor 是響應式程式設計的一種實作。

現代應用程式需要處理大量并發請求并處理大量資料。标準的阻塞代碼不再足以滿足這些要求。

反應式設計模式是一種基于事件的架構方法,用于異步處理來自單個或多個服務處理程式的大量并發服務請求。

Project Reactor 基于這種模式,并有一個明确而雄心勃勃的目标,即在 JVM 上建構非阻塞、反應式應用程式。

2 reactor 優勢和劣勢分别是什麼

  • 優勢
  1. 異步
  2. 非阻塞
  3. 代碼可讀性高
  4. 背壓 解決消息的消費可能比生産慢。
  • 劣勢
  1. 對于非響應式 java 開發者來說,學習曲線陡峭。
  2. debug 難度高

3 reactor 的适用場景

  1. 建立事件驅動程式;
  2. 亞馬遜等大型線上購物平台的通知服務
  3. 為銀行業提供龐大的交易處理服務
  4. 股票價格同時變動的股票交易業務

4 reactor 組成部分和關鍵節點

4.1 Mono

一種生成資料流的方式。包含0-1個結果的異步序列。

Mono.just(1);      

4.2 Flux

另一種生成資料流的方式。包含0-N個結果的異步序列。

Flux.just(1, 2, 3, 4)      

5 底層原理與關鍵實作

生産者-消費者模式?疊代模式?

6 其他競品技術

​​https://lxdd.gitbook.io/spring-webflux/reactor​​

  • Spring Webflux
  • RxJava

Spring WebFlux (project-reactor) 和 RxJava2+ 都是響應式流的實作。

Spring 正在使用 project-reactor,是以它得到了更多的支援、廣告和更大的社群,是以用它的人比較多。

6.1 Spring Webflux

Spring Webflux 是一個使用響應式庫建立 web 服務的架構。它的主要目标是確定低資源使用(即線程數量少)的高可伸縮性。在底層,它使用 Project Reactor,但是,你也可以将它與 RxJava (或任何其他的響應流實作)一起使用,它甚至可以與 Kotlin 協程一起工作。

換句話說, Reactor 是一個基礎響應式包,Spring WebFlux 是一個架構,這個架構預設使用 Reactor,但是可以使用 RxJava,也可以使用 Kotlin 等其他響應式包。

Spring Framework 中包含的原始 Web 架構 Spring Web MVC 是專門為 Servlet API 和 Servlet 容器建構的。反應式堆棧 Web 架構 Spring WebFlux 是在 5.0 版中添加的。它是完全非阻塞的,支援 Reactive Streams 背壓,并且可以在 Netty、Undertow 和 Servlet 3.1+ 容器等伺服器上運作。

6.2 RxJava2

ReactiveX 結合了觀察者模式、疊代器模式和函數式程式設計的最佳思想。它擴充了觀察器模式,以支援資料序列和/或事件,并添加了操作符,允許您以聲明的方式将序列組合在一起,同時抽象出諸如低級線程、同步、線程安全、并發資料結構和非阻塞I/O等問題。

一般來說,RxJava 支援基于 JDK8- 的項目,project Reactor 支援 JDK8 +。但是對于初學者來說,你可以先學習 RxJava。Project Reactor 可以彌補 RxJava 的缺點,更适合後端開發。RxJava 有太多的問題,如果你不能很好地使用它,可能會導緻記憶體溢出。但最後,如果你想很好地使用 Spring 5.2+,你需要學習 RxJava->Reactor->NIO->Netty->Reactor Netty。

6.3 Reactor VS RxJava

RxJava 和 Reactor 是一些非常著名的庫,用于與任何應用程式的後端相關的一些開發。Rxjava 支援的項目大多與 JDK8 相關,而 Reactor 則與所有與 JDK8 + 相關的項目相關。RxJava産生了許多可能導緻記憶體相關問題的問題,但是當與 spring 5.2+ 一起使用時,它會變得非常好。reactor 通常被稱為反應式程式設計範式,它主要涉及用于操作的反應式流 API,并使整個 API 流活動。

​​https://www.educba.com/rxjava-vs-reactor/​​

1、github位址:https://github.com/reactor/reactor-core

2、官方文檔:https://easywheelsoft.github.io/reactor-core-zh/index.html#error.handling