Reactive響應式編程

  Reactive響應式(反應式)編程 是一種新的編程風格,其特點是異步或并發、事件驅動、推送PUSH機制以及觀察者模式的衍生。reactive應用(響應式應用)允許開發人員構建事件驅動(event-driven),可擴展性,彈性的反應系統:提供高度敏感的實時的用戶體驗感覺,可伸縮性和彈性的應用程序棧的支持,隨時可以部署在多核和云計算架構。

  Merriam-Webster 定義reactive是“隨時響應刺激”的響應,也就是說,它的組件是“活躍”,隨時準備接收事件。這個定義抓住了reactive本質。

聚焦在系統上有如下定義:

  1. react to events 對事件立即反應
    事件驅動的自然特性使的反應能夠立即加載實施,通過避免對共享資源的爭用實現可擴展性。
  2. react to failure 對失敗立即反應
    在任何級別都可以建立一個能夠實現失敗恢復的彈性系統。
  3. react to users 對用戶立即反應
    無論任何負載,值得榮耀的響應時間。

 

事件驅動:Event-driven

  基于異步通信的應用程序實現了松耦合的設計,好過于純粹基于同步的方法調用。發送方和接受方可以實現調用,不要關心事件是如何傳播的細節,通過接口實現通信。這就易于延伸,發展和維護,帶來更多的靈活性,并降低了維護成本。

  由于異步通信的接受人可以在事件發生時或收到一條消息之前保持休眠狀態,事件驅動event-driven的方法可以有效地利用現有資源,讓多個收件人可以共享一個硬件線程。相比基于同步的傳統應用程序,一個非阻塞的應用程序在重負載下可以擁有更低的延遲和更高的吞吐量,這將導致更低的運營成本,提高了資源利用率以及良好的終端用戶體驗。

  在一個事件驅動的應用程序中,組件彼此交互是通過離散事件的生產者和消費者( production/consumption )。這些事件是以異步和非阻塞的方式發送和接收的。事件驅動的系統往往依靠推而不是拉或投票表決,即他們是在有消息時才推送數據給消費者,而不是通過一種浪費資源方式:讓消費者不斷地輪詢或等待數據。

  異步發送事件:也被稱為消息傳遞意味著應用程序設計于高并發,能夠無需改動利用多核硬件。任何一個CPU內核都是能夠處理任何消息事件,這導致并行的機會急劇增加。

  非阻塞:意味著應用程序在故障等突發情況下任何時候都能實現響應。而對于這一切所需的資源響應,例如CPU,內存和網絡都不會發生壟斷。因此,它可以同時兼具更低的延遲,更高的吞吐量和更好的可擴展性。

  傳統的服務器端架構是依賴于在一個單獨的線程中共享可變狀態和實現阻塞操作。這樣的系統在滿足不斷變化的需求時難以擴展伸縮,共享可變狀態需要同步,它引入了附帶的復雜性和不確定性,使得程序代碼很難理解和維護。把一個線程通過阻斷方式使用實際是限制了資源,并帶來高昂的喚醒成本。

  事件的產生和處理的解耦,能夠讓運行平臺更關注同步細節以及事件是如何跨線程分發的,當程序抽象抬升到業務流程級別,你考慮的是事件如何傳播以及如何通過系統組件之間進行交互,而不是擺弄周圍的低級初始設備如線程和鎖。

  事件驅動的系統使組件和子系統之間的松耦合。這是可擴展性和彈性的先決條件之一。通過消除復雜和強大的組件之間的依賴,事件驅動的應用可以通過影響最小的方式擴展現有的應用程序。

 

Resilient彈性

  彈性有以下含義:

  1. 物質或物體擁有形狀上彈回的能力。
  2. 從困難中恢復的能力。

  在一個reactive應用中,應變能力不是一個可有可無的東西,而是從一開始就成為設計的一部分。故障應對在編程模型中構建時就第一面對,這就導致應用程序是高度寬容失敗并在運行時能夠提供手段愈合修復自己。傳統的故障處理是不能做到這一點,因為它是要么防御小,要么過于激進,你必須在系統的一個個地方去處理異常Exception(banq:將你的方法到處加上try{}catch)。

  為了管理失敗,我們需要一種方法來隔離它,使它不會擴散到其他健康的部位,并能觀察它,從失敗的上下文以外的安全點對其進行管理。如果其中一個出現故障,不影響其他的。這可以防止級聯故障的經典的問題,并允許隔離管理問題。

  事件驅動的松散耦合提供了組件在失敗下可以抓獲完全隔離的上下文場景,作為消息封裝,發送到其他組件時,在具體編程時可以檢查錯誤比如是否接受到,接受的命令是否可執行等等,并決定如何應對。

  這種方法創建了一個能讓業務邏輯保持清潔的系統,顯式的隔離分開處理Exception的有利于觀察,管理和配置,并能讓系統自行愈合,并自動恢復。這類似在一個大公司內,將一個問題逐步向上升級,直到達到有權力來處理它的水平。

  這個模型的美妙之處在于它是純粹的事件驅動,它是reactive組件和異步事件,意味著在分布式環境中具有在本地一臺服務器范圍內相同的語義。

 

Responsive實時響應

  這是迅速回應或作出適當的反應的意思, 我們使用這個詞在一般意義上不應該與響應的網頁設計混淆,后者主要是指CSS媒體查詢和漸進增強。

  響應的應用程序是實時的,耐看的,豐富的和協作。企業與他們的客戶建立一個開放的和持續的對話,歡迎他們通過響應的互動體驗。這使得它們更有效率,建立連接,并配備解決問題和完成任務的感覺。一個例子是,在使用谷歌Docs 時,幾個用戶能夠編輯文檔協作,能實時地讓他們看到彼此的編輯和注釋的結果。

  對事件作出響應的應用程序,需要及時去做(just do it),即使存在故障情況。如果應用程序在長時間不做出回應,稱為延遲,這個系統實際是不可用的,因此不能被視為彈性。

  當然并非所有應用如武器或醫療監控系統這樣對實時要求如此高,但是通常他們在運行一段時間后出現迅速下降的性能,才可以從他們偏離了一點響應限制看出(banq: windows越用越慢),假如是金融交易應用程序可能會失去目前的交易沒有及時回應。

 

后壓(back pressure)

  Reactive流的主要特征是“back pressure后壓”:也就是說,系統會在它的請求buffer被充滿時,將其推送會給發送者,讓發送者稍后再試,或者使用其他接收器,這就能確保發送者和接收者之間的管道不會被充滿,這樣才有機會獲得一個響應式系統。

  這里有一個源碼展示使用?Akka Streams, Ratpack, Reactor 和 RxJava在一個流Stream中相互協作的代碼案例:reactivestreams/examples/Interop101.java

 

reactivemanifesto.org

go reactive宣言

何為reactive applications

Reactive設計語言與范式

 

JVM應用

RxJava教程

AKKA框架

Actors模型

vertx入門教程

異步編程

Ratpack可快速開發異步響應式的Java Web應用?

基于Vert.x和SpringBoot實現響應式開發

Lagom是一個集成ES/CQRS的Reactive微服務框架

使用Spring Cloud和Reactor在微服務中實現EventSourcing

如何理解Stream processing, Event sourcing, Reactive, CEP?

使用Vert.x開發響應式微服務

Spring 5與Spring cloud的響應式編程之旅

 

Javascript

RxJS入門教程

前端Flux架構簡介

什么是Redux?

React.JS基礎教程

React.js

使用Angular2建立一個可擴展單頁應用

React/Redux有關資源和文章

Elm架構

更多Reactive編程專題

微服務專題

EventSourcing  

 

一级黄色录像影片 夫妻性生活影片 免费在线观看 一级a做爰片