領先一步
VMware 提供培訓和認證,加速您的進展。
瞭解更多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 的新手,您可能需要先跳到全新的網站 http://projectreactor.io,並熟悉一下,這樣才能理解接下來的內容。
除了 2.0.0.M1 版本發佈公告中宣布的變更 之外,以下是 1.1 版本的重要變更簡短列表
Stream
已重寫以實作 Reactive Streams 標準,速度提升 5-10 倍,且比先前版本的額外負擔更少。Stream
的新簽章以及將 Reactor
重新命名為 EventBus
。關於此轉換的文件正在持續編寫中。Stream
API 源自 Reactive Extensions,並鏡像其許多命名慣例。透過利用通用的詞彙和行為,可以輕鬆地將 Rx.NET 和 RxJava 範例翻譯成 Reactor。Stream
整合、DSL 輔助方法。如果我們必須將討論範圍限制在一個變更上,那麼對 Reactive Streams 的原生和基礎支援將是首選。Reactive Streams 對 Reactor 的重要性再怎麼強調也不為過。串流處理是新的潮流,而 Reactor 從專案一開始就擁抱了這一點。然而,Reactive Streams 的加入及其背壓支援的傳播,使得雲端應用程式更容易處理大量即時或近乎即時的資料。現在,諸如負載下的 stop-read
、batch flush
或 adaptive 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 2.0.0.RC1 開始,您可以將 Reactor 包含在您的 Android 應用程式中,只需排除 gs-collections
程式庫即可,否則由於其大小,您將需要費一番功夫。我們為 EventBus
實作了不使用 gs-collections
的 SimpleCachingRegistry
。未來的改進可能包括專用的 UI 事件迴圈 Dispatcher
,以確保您的事件處理常式在正確的執行緒上執行。
我們非常有興趣了解 Reactor 如何促進 Android 裝置上的反應式應用程式,以及這如何與 Reactor 在伺服器端極高的容量、低延遲能力相結合。如果您在 Android 上使用 Reactor,並且有任何我們可以改進體驗的地方,請告訴我們。
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」之類的模式,以防止伺服器從用戶端讀取過多資料,導致下游處理溢位,然後才有資源可用於處理。
在發佈 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 進行管理