反應式編程
舉手 晃動 一起來 Naughty Bounce
反應式編程本質上是一種異步編程方案,在多線程(協程)、異步方法調用、異步I/O訪問等技術基礎之上,提供了一整套與異步調用相匹配的編程模型,從而實現程序調用非阻塞、即時響應等特性,即開發出一個反應式系統。以應對高併發處理需求。
目前主流的反應式編程框架有RxJava、Reactor等,他們的主要特點是基於觀察者設計模式的異步編程方案,編程模型採用函數式編程。
RxJava
RxJava是對Java和安卓進行反應式編程的具體實現,受到了函數式編程的影響。提倡函數組合,避免出現全局狀態和副作用。
Reactor
這個在Netty用的最多
Akka
Akka是基於Scala開發的,雖然同爲JVM上的語言,也提供了Java API,但是Scala還略顯小衆。
項目龐大時,一般將當前系統拆成多個子系統並部署在不同服務器上,每個子系統儘量單一職責,這樣可以解決由於代碼累積造成的維護困難,也有助於分散高併發流量帶來的壓力。
特性
Akka是一款高性能、高容錯性的分佈式&並行應用框架,遵循Apache2開源許可。
- 併發與併發
- 異步非阻塞
- 高容錯性
- 持久化:Actor攜帶的狀態或消息可以被持久化,以便於在JVM崩潰後能恢復狀態。
- 輕量級
應用場景
- 服務後端: rest web,websocket服務,分佈式消息處理等。
- 併發&並行:比如日誌異步處理,密集數據計算等。
Actor是Akka最核心的概念。
Flower
Flower是一個純消息驅動,完全異步,支持命令式編程的反應式編程框架。
當用戶請求達到服務器時,web容器線程不需要執行應用程序代碼,將用戶的HTTP請求轉換成請求對象,將請求對象異步交給Flower框架的Service處理,自身馬上返回(不適合需要同步的接口)。用戶的請求不會被阻塞。
通常Web應用線程阻塞主要是因爲數據庫訪問導致的線程阻塞。異步數據庫訪問後將結果以異步回調的方式發送給Flower的Service進行異步的處理,線程不會被阻塞。
Flower框架實現異步無阻塞,一方面是利用了Web容器的異步特性,主要是Servlet3.0以後提供的AsyncContext,可快速釋放容器線程。Flower框架內,核心的應用代碼之間的異步物阻塞調用則是利用了Akka的Actor模型實現。