中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解響應式編程中Mono和Flux

發布時間:2021-10-28 16:41:54 來源:億速云 閱讀:196 作者:iii 欄目:編程語言

本篇內容介紹了“如何理解響應式編程中Mono和Flux”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1.  前言

很多同學反映對響應式編程中的Flux和Mono這兩個Reactor中的概念有點懵逼。但是目前Java響應式編程中我們對這兩個對象的接觸又最多,諸如Spring  WebFlux、RSocket、R2DBC。

2. 響應流的特點

要搞清楚這兩個概念,必須說一下響應流規范。它是響應式編程的基石。他具有以下特點:

  • 響應流必須是無阻塞的。

  • 響應流必須是一個數據流。

  • 它必須可以異步執行。

  • 并且它也應該能夠處理背壓。

背壓是反應流中的一個重要概念,可以理解為,生產者可以感受到消費者反饋的消費壓力,并根據壓力進行動態調整生產速率。形象點可以按照下面理解:

如何理解響應式編程中Mono和Flux

有沒有背壓的兩種情形

3.  Publisher

由于響應流的特點,我們不能再返回一個簡單的POJO對象來表示結果了。必須返回一個類似Java中的Future的概念,在有結果可用時通知消費者進行消費響應。

Reactive Stream規范中這種被定義為Publisher,Publisher是一個可以提供 0-N  個序列元素的提供者,并根據其訂閱者Subscriber的需求推送元素。一個Publisher可以支持多個訂閱者,并可以根據訂閱者的邏輯進行推送序列元素。下面這個Excel計算就能說明一些Publisher的特點。

如何理解響應式編程中Mono和Flux

A1-A9就可以看做Publisher及其提供的元素序列。A10-A13分別是求和函數SUM(A1:A9)、平均函數AVERAGE(A1:A9)、最大值函數MAX(A1:A9)、最小值函數MIN(A1:A9),可以看作訂閱者Subscriber。假如說我們沒有A10-A13,那么A1-A9就沒有實際意義,它們并不產生計算。這也是響應式的一個重要特點:當沒有訂閱時發布者什么也不做。

而Flux和Mono都是Publisher在Reactor  3實現。Publisher提供了subscribe方法,允許消費者在有結果可用時進行消費。如果沒有消費者Publisher不會做任何事情,他根據消費情況進行響應。Publisher可能返回零或者多個,甚至可能是無限的,為了更加清晰表示期待的結果就引入了兩個實現模型Mono和Flux。

4. Flux

Flux是一個發出(emit)0-N個元素組成的異步序列的Publisher,可以被onComplete信號或者onError信號所終止。在響應流規范中存在三種給下游消費者調用的方法  onNext, onComplete, 和onError。下面這張圖表示了 Flux 的抽象模型:

如何理解響應式編程中Mono和Flux

Flux

以上的的講解對于初次接觸反應式編程的依然是難以理解的,所以這里有一個循序漸進的理解過程。

有些類比并不是很妥當,但是對于你循序漸進的理解這些新概念還是有幫助的。

傳統數據處理

我們在平常是這么寫的:

public List<ClientUser> allUsers() {     return Arrays.asList(new ClientUser("felord.cn", "reactive"),             new ClientUser("Felordcn", "Reactor")); }

我們通過迭代返回值List來get這些元素進行再處理(消費),這種方式有點類似廚師做了很多菜,吃不吃在于食客。需要食客主動去來吃就行了(pull的方式),至于喜歡吃什么不喜歡吃什么自己隨意,怎么吃也自己隨意。

流式數據處理

在Java 8中我們可以改寫為流的表示:

public Stream<ClientUser> allUsers() {     return  Stream.of(new ClientUser("felord.cn", "reactive"),             new ClientUser("Felordcn", "Reactor")); }

依然是廚師做了很多菜,但是這種就更加高級了一些,提供了菜品的搭配方式(不包含具體細節),食客可以按照說明根據自己的習慣搭配著去吃,一但開始概不退換,吃完為止,過期不候。

反應式數據處理

在Reactor中我們又可以改寫為Flux表示:

public Flux<ClientUser> allUsers(){     return Flux.just(new ClientUser("felord.cn", "reactive"),             new ClientUser("Felordcn", "Reactor")); }

這時候食客只需要訂餐就行了,做好了自然就呈上來,而且可以隨時根據食客的飯量進行調整。如果沒有食客訂餐那么廚師就什么都不用做。當然不止有這么點特性,不過對于方便我們理解來說這就夠了。

5. Mono

Mono 是一個發出(emit)0-1個元素的Publisher,可以被onComplete信號或者onError信號所終止。

如何理解響應式編程中Mono和Flux

Mono

這里就不翻譯了,整體和Flux差不多,只不過這里只會發出 0-1  個元素。也就是說不是有就是沒有。象Flux一樣,我們來看看Mono的演化過程以幫助理解。

傳統數據處理

public ClientUser currentUser () {     return isAuthenticated ? new ClientUser("felord.cn", "reactive") : null; }

直接返回符合條件的對象或者null。

Optional 的處理方式

public Optional<ClientUser> currentUser () {     return isAuthenticated ? Optional.of(new ClientUser("felord.cn", "reactive"))             : Optional.empty(); }

這個Optional我覺得就有反應式的那種味兒了,當然它并不是反應式。當我們不從返回值Optional取其中具體的對象時,我們不清楚里面到底有沒有,但是Optional是一定客觀存在的,不會出現NPE問題。

反應式數據處理

public Mono<ClientUser> currentUser () {     return isAuthenticated ? Mono.just(new ClientUser("felord.cn", "reactive"))             : Mono.empty(); }

和Optional有點類似的機制,當然Mono不是為了解決NPE問題的,它是為了處理響應流中單個值(也可能是Void)而存在的。

“如何理解響應式編程中Mono和Flux”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永顺县| 防城港市| 阿合奇县| 梧州市| 广汉市| 龙山县| 庆云县| 定结县| 九江市| 贺兰县| 江陵县| 尼木县| 定远县| 昭平县| 轮台县| 和林格尔县| 镇江市| 临高县| 海门市| 奉贤区| 泰宁县| 七台河市| 许昌市| 安阳市| 正阳县| 祁阳县| 米易县| 诸暨市| 新竹市| 岑溪市| 瑞金市| 思南县| 宁城县| 苍溪县| 顺平县| 遵义县| 微博| 宿松县| 泸溪县| 西青区| 新昌县|