![](/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.