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,現在實作了 Reactive Streams 標準

請注意,Reactor 2.0 的 Maven 坐標已從 Reactor 1.x 的坐標變更。新的坐標都歸於群組 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,並熟悉一下,這樣才能理解接下來的內容。

變更記錄摘要

除了 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 開始,您可以將 Reactor 包含在您的 Android 應用程式中,只需排除 gs-collections 程式庫即可,否則由於其大小,您將需要費一番功夫。我們為 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 支援可能還會有一些新增功能,因為第一個版本只是一組相當簡單的功能。我們也可能會在邊緣情況下發現更多錯誤。

我們對這個候選版本感覺相當良好,並鼓勵您試用它。如果您正在進行新的開發,那麼我們絕對鼓勵您在 Reactor 2.0 的 Reactive Streams 基礎上建構,而不是在功能較弱的、預先 Reactive Streams 版本的 1.1 上建構。如果您正在升級現有的 Reactor 程式碼,則路徑實際上非常容易。在幾乎所有情況下,您的程式碼都將大大簡化。

取得支援

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

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

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

取得程式碼

Reactor 採用 Apache 2.0 授權,專案透過 GitHub 進行管理

取得 Spring 電子報

隨時掌握 Spring 電子報的最新資訊

訂閱

領先一步

VMware 提供培訓和認證,加速您的進展。

瞭解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

瞭解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

檢視全部