領先一步
VMware 提供培訓和認證,助您加速發展。
瞭解更多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 完全陌生,可能需要先訪問煥然一新的新網站 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 開始,只需排除 gs-collections
庫即可將 Reactor 包含在您的 Android 應用程式中,否則該庫的大小會迫使您繞一些彎路。我們為 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 支援進行一些補充。在某些邊緣情況下,我們可能還會遇到一些其他 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 管理