簡體   English   中英

如何在Akka Streams Map和MapAsync中使用異步驅動程序

[英]How to use asynchronous drivers in akka-streams map vs mapAsync

我剛剛開始使用reactcouchbase異步數據庫驅動程序,但是遇到了一些基本的設計問題。 在傳統方法中,我將通過限制與數據庫的連接數來限制對數據庫的壓力。 但是,使用異步驅動程序,我可以使用新查詢填充數據庫嗎?

在以下示例中,這變得很重要。

可以說我有兩種不同的調用數據庫的方法。

我的函數調用數據庫:

asyncCallDB: Future[DBResponse]
blockingCallDB: DBResponse

現在,我想在一個流上映射數據庫調用,在其中可以使用兩個不同的函數:

Flow.map()
Flow.mapAsync(numberOfConcurrentCalls)()

現在,我的問題是如何選擇調用數據庫:

Flow.map(blockingCallDB) //One call at a time with back preassure
Flow.map(asyncCallDB) //Unlimited calls floods db no back pressure?

Flow.mapAsync(numberOfConcurrentCalls)(blockingCallDB) //Up to numberOfConcurrentCalls at the same time with back pressure
Flow.mapAsync(numberOfConcurrentCalls)(asyncCallDB) //Unlimited calls floods db no back pressure?

我覺得這里缺乏了解,我想了解這種決定。

ReactiveCouchbase使用AsyncHttpClient與Couchbase服務器進行通信。 如您在源代碼中所見,它調用setMaximumConnectionsTotal ,它限制了並發連接的數量。 實際值取決於您在couchbase.http.maxTotalConnections配置的couchbase.http.maxTotalConnections

您創建的每個CouchbaseBucket都有一個AsyncHttpClient 因此,每個CouchbaseBucket最多具有maxTotalConnections連接。

N1QL REST API的Couchbase文檔中

REST API 同步運行,因此,一旦開始執行請求中的語句,結果就會流回到客戶端,並在語句執行完成時終止。

因此,實際上,每個存儲桶的並發查詢數限制為maxTotalConnections

因此,DB上的背壓始終以某種方式受到限制。 可能是因為將maxTotalConnections設置為非負數,或者是由於RAM或文件描述符數量有限,客戶端無法創建更多連接。

但是,仍然可能創建太多Future ,從而使客戶端的內存不足。 只要您認為可能是這種情況,就應該使用此答案中提到的mapAsync“緩沖區和使用速率”(Akka文檔)中提到的其他技術之一。

Akka文檔中對mapAsync進行很好的描述

將傳入的元素傳遞給返回Future結果的函數。 當未來到來時,結果將傳遞到下游。 最多可以同時處理n個元素 ...

請記住, Flow.mapAsync本身不會運行任何東西,它只會返回一個Flow ,您必須將它連接在SourceSink ,然后再run 《 Akka快速入門指南》以一種非常容易理解的方式對此進行了描述。

暫無
暫無

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

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