RxJava開發精要1-從.NET到RxJava

RX - 從.NET到RxJava

響應式編程是一種基於異步數據流概念的編程模式。數據流就像一條河:它可以被觀測,被過濾,被操做。或者爲新的消費者與另一條流合併爲一條新的流。java

響應式編程的一個關鍵概念是事件。事件可以被等待。可以觸發過程。也可以觸發其它事件。事件是惟一的以合適的方式將咱們的現實世界映射到咱們的軟件中:假設屋裏太熱了咱們就打開一扇窗戶。相同的。當咱們更改電子錶(變化的傳播)中的一些數值時,咱們需要更新整個表格或者咱們的機器人碰到牆時會轉彎(響應事件)。git

今天,響應式編程最通用的一個場景是UI:咱們的移動App必須作出對網絡調用、用戶觸摸輸入和系統彈框的響應。在這個世界上,軟件之因此是事件驅動並響應的是因爲現實生活也是如此。github

微軟響應式擴展

函數響應式編程是一個來自90年代後期受微軟的一名計算機科學家Erik Meijer啓示的思想。用來設計和開發微軟的Rx庫。數據庫

Rx 是微軟.NET的一個響應式擴展。編程

Rx藉助可觀測的序列提供一種簡單的方式來建立異步的,基於事件驅動的程序。開發人員可以使用Observables模擬異步數據流,使用LINQ語法查詢Observables。並且很是easy管理調度器的併發。markdown

Rx讓衆所周知的概念變得易於實現和消費,好比push方法。在響應式的世界裏。咱們不能僞裝做用戶不關注或者是不抱怨它而一味的等待函數的返回結果,網絡調用,或者數據庫查詢的返回結果。網絡

咱們時刻都在等待某些東西,這就讓咱們失去了並行處理其它事情的機會,提供更好的用戶體驗,讓咱們的軟件免受順序鏈的影響,而堵塞編程。架構

下表列出的與.NET 枚舉相關的.NET Observable併發

.NET Observable 一個返回值 多個返回值
Pull/Synchronous/Interactive T IEnumerable<T>
Push/Asynchronous/Reactive Task<T> IObservable<T>

push方法把這個問題逆轉了:取而代之的是再也不等待結果,開發人員僅僅是簡單的請求結果,而當它返回時獲得一個通知就能夠。開發人員對即將發生的事件提供一個清晰的響應鏈。對於每一個事件,開發人員都做出對應的響應;好比。用戶被要求登陸的時候,提交一個攜帶他的username和password的表單。應用程序運行登陸的網絡請求,接下來將要發生的狀況有:異步

  • 顯示一個成功的信息,並保存用戶的我的信息。
  • 顯示一個錯誤的信息

正如你用push方法所示。開發人員不需要等待結果。而是在結果返回時通知他。在這期間,他可以作他想作的不論什麼事情:

  • 顯示一個進度對話框
  • 爲下次登陸保存username和password
  • 預載入一些他以爲登陸成功後需要耗時處理的事情

來到Java世界 - Netflix RxJava

Netflix在2012年開始意識到他們的架構要知足他們龐大的用戶羣體已經變得寸步難行。所以他們決定又一次設計架構來下降REST調用的次數。

代替幾十次的REST調用。而是讓client本身處理需要的數據。他們決定基於client需求建立一個專門優化過的REST調用。

爲了實現這一目標。他們決定嘗試響應式,開始將.NET Rx遷移到JVM上面。他們不想僅僅基於Java語言。而是整個JVM。從而有可能爲市場上的每一種基於JVM的語言:如Java、Closure、Groovy、Scala等等提供一種新的工具。

2013年二月份,Ben Christensen 和 Jafar Husain發在Netflix技術博客的一篇文章第一次向世界展現了RxJava。

主要特色有:

  • 易於併發從而更好的利用server的能力。
  • 易於有條件的異步運行。
  • 一種更好的方式來避免回調地獄。
  • 一種響應式方法。

正如.NET,RxJava Observable 是push 迭代的等價體。即pull。pull方法是堵塞並等待的方法:消費者從源頭pull值。並堵塞線程直到生產者提供新的值。

push方法做用於訂閱和響應:消費者訂閱新值的發射,當它們可用時生產者push這些新值並通知消費者。在這一點上,消費者消費了它們。push方法很是明顯更靈活。因爲從邏輯和實踐的觀點來看,開發人員僅僅需忽略他需要的數據是來自同步仍是異步;他的代碼將仍然起做用。

RxJava的不同凡響之處

從純Java的觀點看,RxJava Observable類源自於經典的Gang Of Four的觀察者模式。

它加入了三個缺乏的功能:

  • 生產者在沒有不少其它數據可用時可以發出信號通知:onCompleted()事件。
  • 生產者在錯誤發生時可以發出信號通知:onError()事件。
  • RxJava Observables 可以組合而不是嵌套,從而避免開發人員陷入回調地獄。

Observables和Iterables共用一個相似的API:咱們在Iterable可以運行的不少操做也都相同可以在Observables上運行。固然,因爲Observables流的本質。沒有如Iterable.remove()這樣對應的方法。

Pattern 一個返回值 多個返回值
Synchronous T getData() Iterable<T>
Asynchronous Future<T> getData() Observable<T> getData()

從語義的角度來看。RxJava就是.NET Rx。從語法的角度來看,Netflix考慮到了對應每一個Rx方法,保留了Java代碼規範和主要的模式。

總結

本章中,咱們初步探索了響應式的世界。從微軟的.NET到Netflix的RxJava。咱們瞭解了Rx是怎樣誕生的,咱們也瞭解到傳統的方法與響應式方法相比之間的相似和不一樣。

下一章。咱們將學習到Observables是什麼,以及怎樣建立它並把響應式編程應用到咱們的平常編碼中去。

相關文章
相關標籤/搜索