Reactive 編程模型有哪些價值?它的原理是什么?如何正確使用?文本為大家詳細講解。
Reactive 和 Reactive programming
Reactive 直接翻譯的意思式反應式,反應性。咋一看,似乎不太好懂。
鎮江網站制作公司哪家好,找創新互聯建站!從網頁設計、網站建設、微信開發、APP開發、成都響應式網站建設等網站項目制作,到程序開發,運營維護。創新互聯建站自2013年創立以來到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創新互聯建站。舉個例子:在 Excel 里,C 單元格上設置函數 Sum(A+B),當你改變單元格 A 或者單元格 B 的數值時,單元格 C 的值同時也會發生變化。這種行為就是 Reactive。
在計算機編程領域,Reactive 一般指的是 Reactive programming。指的是一種面向數據流并傳播事件的異步編程范式(asynchronous programming paradigm)。
先舉個例子大家感受一下:
public static void main(String[] args) { FluxProcessor<Integer, Integer> publisher = UnicastProcessor.create(); publisher.doOnNext(event -> System.out.println(receive event: + event)).subscribe(); publisher.onNext(1); // print \'receive event: 1\' publisher.onNext(2); // print \'receive event: 2\' }
代碼 1
以上例代碼(使用 Reactor 類庫)為例,publisher 產生了數據流 (1,2),并且傳播給了 OnNext 事件, 上例中 lambda 響應了該事件,輸出了相應的信息。上例代碼中生成數據流和注冊/執行 lambda 是在同一線程中,但也可以在不同線程中。
注:如果上述代碼執行邏輯有些疑惑,可以暫時將 lambda 理解成 callback 就可以了。
Reactive Manifesto對于 Reactive 現在你應該大致有一點感覺了,但是 Reactive 有什么價值,有哪些設計原則,估計你還是有些模糊。這就是 Reactive Manifesto 要解決的疑問了。
使用 Reactive 方式構建的系統具有以下特征:
即時響應性 (Responsive)
只要有可能, 系統就會及時地做出響應。即時響應是可用性和實用性的基石, 而更加重要的是,即時響應意味著可以快速地檢測到問題并且有效地對其進行處理。即時響應的系統專注于提供快速而一致的響應時間, 確立可靠的反饋上限, 以提供一致的服務質量。這種一致的行為轉而將簡化錯誤處理、 建立最終用戶的信任并促使用戶與系統作進一步的互動。
回彈性 (Resilient)
系統在出現失敗時依然保持即時響應性。這不僅適用于高可用的、 任務關鍵型系統——任何不具備回彈性的系統都將會在發生失敗之后丟失即時響應性。回彈性是通過復制、 遏制、 隔離以及委托來實現的。失敗的擴散被遏制在了每個組件內部, 與其他組件相互隔離, 從而確保系統某部分的失敗不會危及整個系統,并能獨立恢復。每個組件的恢復都被委托給了另一個(外部的)組件, 此外,在必要時可以通過復制來保證高可用性。(因此)組件的客戶端不再承擔組件失敗的處理。
彈性 (Elastic)
系統在不斷變化的工作負載之下依然保持即時響應性。反應式系統可以對輸入(負載)的速率變化做出反應,比如通過增加或者減少被分配用于服務這些輸入(負載)的資源。這意味著設計上并沒有爭用點和中央瓶頸, 得以進行組件的分片或者復制, 并在它們之間分布輸入(負載)。通過提供相關的實時性能指標, 反應式系統能支持預測式以及反應式的伸縮算法。這些系統可以在常規的硬件以及軟件平臺上實現成本高效的彈性。
消息驅動 (Message Driven)
反應式系統依賴異步的消息傳遞,從而確保了松耦合、隔離、位置透明的組件之間有著明確邊界。這一邊界還提供了將失敗作為消息委托出去的手段。使用顯式的消息傳遞,可以通過在系統中塑造并監視消息流隊列, 并在必要時應用回壓, 從而實現負載管理、 彈性以及流量控制。使用位置透明的消息傳遞作為通信的手段, 使得跨集群或者在單個主機中使用相同的結構成分和語義來管理失敗成為了可能。非阻塞的通信使得接收者可以只在活動時才消耗資源, 從而減少系統開銷。
注:
上面描述有很多專有名詞,可能有些疑惑,可以看下相關名詞解釋。 為什么使用 Reactive 方式構建的系統會具有以上價值, 我稍后在 Reactor 章節中介紹。 Reactive Stream知道了 Reactive 的概念,特征和價值后,是否有相關的產品或者框架來幫助我們構建 Reactive 式系統呢?在早些時候有一些類庫 (Rxjava 1.x, Rx.Net) 可以使用,但是規范并不統一,所以后來 Netfilx, Pivotal 等公司就制定了一套規范指導大家便于實現它(該規范也是受到早期產品的啟發),這就是 Reactive Stream 的作用。
Reactive Stream 是一個使用非阻塞 back pressure(回壓)實現異步流式數據處理的標準。目前已經在 JVM 和 JavaScript 語言中實現同一套語意的規范;以及嘗試在各種涉及到序列化和反序列化的傳輸協議(TCP, UDP, HTTP and WebSockets)基礎上,定義傳輸 reactive 數據流的網絡協議。
Reactive Streams 解決的問題場景The purpose of Reactive Streams is to provide a standard for asynchronous stream processing with non-blocking backpressure.
當遇到未預料數據流時,依然可以在可控資源消耗下保持系統的可用性。
Reactive Streams 的目標控制在一個異步邊界的流式數據交換。例如傳遞一個數據到另外一個線程或者線程池,確保接收方沒有 buffer(緩存)任意數量的數據。而 back pressure(回壓)是解決這種場景的不可或缺的特性。
Reactive Streams 規范適用范圍此標準只描述通過回壓來實現異步流式數據交換的必要的行為和實體,最小接口,例如下方的 Publisher, Subscriber。Reactive Streams 只關注在這些組件之間的流式數據中轉,并不關注流式數據本身的組裝,分割,轉換等行為, 例如 map, zip 等 operator。Reactive Streams 規范包括:
Publisher
產生一個數據流(可能包含無限數據), Subscriber 們可以根據它們的需要消費這些數據。
public interface Publisher<T> { public void subscribe(Subscriber<? super T> s); }
Subscriber
Publisher 創建的元素的接收者。監聽指定的事件,例如 OnNext, OnComplete, OnError 等。
publicinterface Subscriber<T> { public void onSubscribe(Subscription s); public void onNext(T t); public void onError(Throwable t); public void onComplete(); }
Subscription
是 Publisher 和 Subscriber 一對一的協調對象。Subscriber 可以通過它來向 Publisher 取消數據發送或者 request
分享文章:Reactive架構將是未來的主流
網站鏈接:http://vcdvsql.cn/article2/chssic.html
成都網站建設公司_創新互聯,為您提供關鍵詞優化、網站建設、動態網站、電子商務、網站內鏈、域名注冊
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯