Reactor 2.0.0.RC1 版本現已釋出,原生支援 Reactive Streams!

版本釋出 | Jon Brisbin | 2015 年 2 月 18 日 | ...

Reactor 團隊很高興地宣佈釋出 2.0.0.RC1 版本,該版本現已在 spring.io Maven 倉庫 以及 Maven central 中提供。2.0 版本是 Reactor 1.1 的一次 #uberupdate(重大更新),包含幾個新元件,並對諸如 Stream 等重要類進行了全面重寫,Stream 現在實現了 Reactive Streams 標準

請注意,Reactor 2.0 的 Maven 座標已從 Reactor 1.x 的座標更改。新座標的 group ID 全部為 io.projectreactor,而不是之前的 org.projectreactor。一個 Gradle 專案的依賴塊示例可能如下所示:

ext {
  reactorVersion = '2.0.0.RC1'
}

repositories {
  maven { url 'http://repo.spring.io/libs-milestone' }
  mavenCentral()
}

compile "io.projectreactor:reactor-core:$reactorVersion",
    "io.projectreactor:reactor-net:$reactorVersion",
    "io.projectreactor.spring:reactor-spring-context:$reactorVersion"

什麼是 Reactor?

如果您對 Reactor 完全陌生,可能需要先訪問煥然一新的新網站 http://projectreactor.io,在瞭解它之後,本文的一些內容才會更容易理解。

更新日誌(TL;DR,太長不看版)

除了 2.0.0.M1 版本中宣佈的更改之外,以下是相對於 1.1 版本的一些重要更改的簡要列表:

  • Stream 已重寫以實現 Reactive Streams 標準,速度比之前版本快 5-10 倍,並且開銷大大降低。
  • 從 Reactor 1.x 程式碼升級並不困難,只需對現有程式碼進行少量更改即可適應 Stream 的新簽名以及將 Reactor 重新命名為 EventBus。關於此過渡的文件正在編寫中。
  • Reactor 的 Stream API 源自 Reactive Extensions,並沿用了其許多命名約定。透過利用通用的詞彙和行為,可以輕鬆將 Rx.NET 和 RxJava 示例轉換為 Reactor。
  • Reactor 的 API 已圍繞靜態輔助方法和工廠進行了統一,以使嵌入儘可能容易。
  • TCP 支援全面增強:Reactive Streams 背壓、HTTP 伺服器和客戶端、Stream 整合、DSL 輔助方法。
  • 一個新網站,包含正在構建的正式參考手冊、更多示例和更多 javadoc。
  • 來自不僅僅是核心專案提交者的社群貢獻。

Reactive Streams 真是太棒了

如果我們只能談論一個變化,那就是對 Reactive Streams 的原生和基礎支援。Reactive Streams 對 Reactor 的重要性怎麼強調都不為過。流處理是新的 熱點,Reactor 從專案伊始就擁抱了這一點。然而,Reactive Streams 的加入及其背壓支援的傳播,使得在真實或接近即時的情況下處理大量資料對您的雲應用程式變得更加容易。現在,諸如負載下的 stop-readbatch flushadaptive batch 等模式都可以直接使用。

Reactor Stream 中的每個步驟都是一個 Reactive Streams 元件,它根據當前資源限制下的處理速率正確地傳播需求和背壓。使用 Reactive Streams,Reactor 2.0 可以建立自動調整資源使用的處理流。由於 Reactive Streams 背壓向上遊傳遞的方式,您可以影響新專案被拉入系統的速率。這意味著如果當前處理正在使用所有可用資源,下游的慢速元件可以一直向源頭施壓,以減慢輸入速率。

Pool<Connection> pool;
Stream<Message> input;

input.capacity(1)
     .batchConsume(msg -> {
       pool.getConnection().merge(msg);
     }, requestMore -> Math.max(pool.getSize() - pool.getActive(), 1));

在上面的程式碼片段中,我們根據連線池中可用連線的數量來調整要處理的專案數量。作為 batchConsume 方法的第一個引數傳入的 Consumer 將根據作為第二個引數傳入的 Function 返回的 requestMore 值來呼叫。在本例中,我們將預取數量等於連線池中空閒連線數的或僅預取單個訊息(如果所有連線都處於活動狀態)的訊息(在這種情況下,我們將依賴於連線池的背壓)。

如果我們想確保我們的流不會佔用過多資源,我們還可以更改容量演算法,使其返回一個小於可用連線數的值,這將為應用程式中的其他元件保留一些連線。

Reactor 現在支援 Android

從 Reactor 2.0.0.RC1 開始,只需排除 gs-collections 庫即可將 Reactor 包含在您的 Android 應用程式中,否則該庫的大小會迫使您繞一些彎路。我們為 EventBus 實現了一個不使用 gs-collectionsSimpleCachingRegistry。未來的改進可能包括一個專用的 UI 事件迴圈 Dispatcher,以確保您的事件處理程式在正確的執行緒上執行。

我們非常期待看到 Reactor 如何促進 Android 裝置上的響應式應用程式,以及這與 Reactor 在伺服器端極高的吞吐量和低延遲能力如何關聯。如果您正在 Android 上使用 Reactor,並且有任何可以改進體驗的建議,請告知我們。

HTTP、改進的 TCP 和 ZeroMQ 支援

RC1 基於 Reactor 對 Netty 4 的使用引入了新的 HTTP 支援。它尚未全面,但為構建(和訪問)基於 REST 的非阻塞微服務和納服務提供了一些輔助方法和有用的抽象。我目前還不會嘗試用它構建生產服務,因為在 GA 版本釋出之前還需要進行一些改進。您可以使用 Reactor 嵌入微服務,而無需直接呼叫 Netty API。

以下程式碼建立一個基於 Netty 的嵌入式 HTTP 伺服器,該伺服器帶有路徑引數,並將任務分派到共享的 RingBufferDispatcher 上。

HttpServer<String, String> server = NetStreams.httpServer(
  spec -> spec.listen(3000)
              .codec(StandardCodecs.STRING_CODEC)
              .dispatcher(Environment.sharedDispatcher())
);

server.get("/echo/{greeting}", ch -> {
  String greeting = ch.param("greeting") + " World!";

  ch.transfer(Transfer.NON_CHUNKED)
    .responseHeader("Content-Length", "" + greeting.length())
    .log("server");

  return Streams.just(greeting);
});

server.start();

我們還更新了 TCP 和 ZeroMQ 支援,以更好地利用我們對 Stream 所做的重要更改。最重要的是,TCP 伺服器和客戶端利用 Reactive Streams 背壓支援來實現諸如“stop-read”之類的模式,以防止伺服器在下游處理資源可用之前從客戶端讀取過多資料而導致溢位。

通往 GA(正式釋出)版本之路

在釋出 Reactor 2.0 GA 版本之前,我們將至少再發佈一個 RC 版本。在複雜的 fork/join 分發方面,我們還需要進行一些調整才能對它的可預測性感到滿意。由於第一個版本的功能集相當簡單,我們可能會對 HTTP 支援進行一些補充。在某些邊緣情況下,我們可能還會遇到一些其他 bug。

我們對這個候選版本感到非常滿意,並鼓勵您試用它。如果您正在進行新的開發,我們強烈建議您在 Reactor 2.0 的 Reactive Streams 基礎上構建,而不是使用功能較弱的 1.1 版本(非 Reactive Streams 版本)。如果您正在升級現有的 Reactor 程式碼,過程實際上非常簡單。在幾乎所有情況下,您的程式碼都將得到極大的簡化。

獲取支援

如果您在升級程式碼時遇到問題,或者對如何使用 Reactor 解決您的快速資料問題有一般性疑問,請隨時在 Reactor Framework Google Group 上提問。

我們也歡迎社群透過 GitHub 上的拉取請求做出貢獻。

您可能也有興趣瞭解,Reactive Streams 專案正在考慮以新的 java.util.concurrent.Flow 類及其相應的內部類的形式納入 JDK 9。關於此主題的討論正在由紐約州立大學奧斯威戈分校的 Doug Lea 教授管理的 JSR-166 concurrency-interest 郵件列表進行。

獲取程式碼

Reactor 採用 Apache 2.0 許可證,專案透過 GitHub 管理

獲取 Spring 資訊

訂閱 Spring 資訊,保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速發展。

瞭解更多

獲取支援

Tanzu Spring 透過一個簡單的訂閱即可為 OpenJDK™、Spring 和 Apache Tomcat® 提供支援和二進位制檔案。

瞭解更多

近期活動

檢視 Spring 社群的所有近期活動。

檢視全部