簡體   English   中英

在非阻塞異步服務上調用阻塞端點

[英]Calling blocking endpoint on non-blocking asynchronous service

如果我的反應式端點需要調用一個外部的、非反應式的端點來阻塞東西,我的反應式端點是否仍然是反應式的?

我有 2 個服務正在運行,它們利用 Spring Boot MVC 和 Spring Webflux。

服務 A Spring Webflux

服務 B Spring MVC

現在我的服務 A 響應調用阻塞的服務 B 端點。 我的服務 A 會受到影響並且沒有反應嗎?

如果是? 如何解決這種情況,使我的反應端點保持反應狀態?

如果服務 A 使用 webflux 編寫為響應式服務,則無論它調用誰,它都將始終保持響應式。

我假設我們現在正在使用例如webclient談論 http/https 。

關於響應式的事情是,如果服務 B 響應非常慢,您的服務 A 將不會讓調用線程等待響應,而是服務 A 的線程將 go 並在等待服務 b 的響應時做其他事情,當響應返回時,任何線程都可以獲取響應並繼續。

如果僅調用其他響應式服務,則響應式服務不是響應式的。 它總是被動的。 因為它對事件做出反應。

有一些警告。 例如,如果您正在與數據庫通信,這里的數據庫驅動程序需要是遵循 R2DBC 規范的特定驅動程序。

您會看到關於如何編寫數據庫驅動程序的傳統 JDBC 規范被設計為固有阻塞。 如果您遵循規范並編寫了驅動程序,則驅動程序將自動必須阻塞。 你別無選擇。

因此 spring 創建了一個新規范 (R2DBC),它本身並不是阻塞的,因此您需要一個符合該規范的驅動程序。 否則你的服務會受到阻塞行為的影響。

但你的問題的答案是。

不,如果我們在談論 http 從一項服務到另一項服務。

暫無
暫無

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

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