簡體   English   中英

使用帶有阻塞方法的反應性 spring 數據 (mongdb) 的不利/性能影響

[英]Downside/Performace Impact in using reactive spring data (mongdb) with blocking methods

我對反應式編程非常陌生,目前正在研究微服務,其中使用 spring mvc 和 Spring 數據 MongoDb 用於數據庫連接。

當我瀏覽 spring 數據 mongo db 文檔時,支持響應式存儲庫、響應式模板 api 等。

那么,如果我選擇使用具有阻塞性質的反應式模板和存儲庫,會有什么缺點嗎?

Ex.    
reactiveMongoTemplate.add(entity).block()
reactiveMongoTemplate.update(id, entity).block()

使用上述調用與使用阻塞存儲庫和模板 api 本身有什么顯着區別嗎?

答案取決於您使用的堆棧:Spring WebFlux 或 Spring Web MVC。

Spring WebFlux的情況下,選擇是顯而易見的:您必須使用 ReactiveMongoTemplate並且永遠不要在其上調用block ,而是在從模板中獲取 Mono/Flux 時返回它。

Spring Web MVC的情況下,您可以自由使用常規阻塞 MongoTemplate 和 ReactiveMongoTemplate with block 雖然,在大多數情況下,為了簡單和性能,您應該使用舊的 MongoTemplate go 與阻塞 MongoTemplate 相比,ReactiveMongoTemplate 有一些開銷,因為反應類型 Mono/Flux 對 memory 施加了一些額外的壓力。

我可以想象一個用例,即使在 Spring MVC 中,ReactiveMongoTemplate 也可以提供一些優勢:在一個 HTTP 請求期間,您必須同時執行多個 Mono 操作。 如果您使用阻塞 MongoTemplate,那么您需要設置一個線程池並在那里委派查詢執行。 但是,使用 ReactiveMongoTemplate,您可以使用 Mono 和 Flux 的許多運算符來完成此任務,而無需擔心線程、線程池和縮放問題。

在傳統編程中,您通常擁有正在運行的線程,而在反應式編程中,情況並非如此。 這個“底層執行單元”(如果您願意,可以使用 cpu 資源消費者)不是您的,而是當前恰好執行您的任務的“全局”事物,但可以很快切換到做其他事情。

所以當你阻塞時,你對這個“全局執行單元”說“嘿,停止做其他事情,等我”。 在傳統方法中,這還不錯,因為您有一個與當前請求相關聯的線程,其他請求(或如果您的系統不是基於 web 的流)應該與從相當大的線程池中獲取的其他線程一起執行。 然而,在反應式系統中,情況並非如此,因為您試圖使用少量這些“全局執行單元”。

好的,所以如果你阻塞,整個地方的事件將停止發射並開始緩沖。 這可能會導致整個系統變得無法使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM