![](/img/trans.png)
[英]ExecutionContext to use with mapAsync in Akka-Streams
[英]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
連接。
REST API 同步運行,因此,一旦開始執行請求中的語句,結果就會流回到客戶端,並在語句執行完成時終止。
因此,實際上,每個存儲桶的並發查詢數限制為maxTotalConnections
。
因此,DB上的背壓始終以某種方式受到限制。 可能是因為將maxTotalConnections
設置為非負數,或者是由於RAM或文件描述符數量有限,客戶端無法創建更多連接。
但是,仍然可能創建太多Future
,從而使客戶端的內存不足。 只要您認為可能是這種情況,就應該使用此答案中提到的mapAsync
或“緩沖區和使用速率”(Akka文檔)中提到的其他技術之一。
將傳入的元素傳遞給返回Future結果的函數。 當未來到來時,結果將傳遞到下游。 最多可以同時處理n個元素 ...
請記住, Flow.mapAsync
本身不會運行任何東西,它只會返回一個Flow
,您必須將它連接在Source
和Sink
,然后再run
。 《 Akka快速入門指南》以一種非常容易理解的方式對此進行了描述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.