繁体   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