map(T=>;Future[U])和flatMapConcat(T=>;Source.fromFuture(Future[U])之间的Akka流差异

map(T=>;Future[U])和flatMapConcat(T=>;Source.fromFuture(Future[U])之间的Akka流差异,akka,akka-stream,Akka,Akka Stream,请问,这两种定义接收器的方法有什么区别[RandomCdr,Future[Done] Flow[RandomCdr] .grouped(bulkSize) .flatMapConcat{ (bulk : Seq[RandomCdr]) => Source.fromFuture(collection.flatMap(_.insert[RandomCdr](false)(randomCdrWriter,ec).many(bulk)(ec))(ec))

请问,这两种定义接收器的方法有什么区别[RandomCdr,Future[Done]

Flow[RandomCdr]
      .grouped(bulkSize)
      .flatMapConcat{ (bulk : Seq[RandomCdr]) =>
        Source.fromFuture(collection.flatMap(_.insert[RandomCdr](false)(randomCdrWriter,ec).many(bulk)(ec))(ec))
      }
      .toMat(Sink.ignore)(Keep.right)


Flow[RandomCdr]
  .grouped(bulkSize)
  .map((bulk : Seq[RandomCdr]) => collection.flatMap(_.insert[RandomCdr](false)(randomCdrWriter,ec).many(bulk)(ec))(ec))
  .toMat(Sink.ignore)(Keep.right)

返回未来[T]的函数
collection.flatMap(uu.insert[RandomCdr](false)(randomCdrWriter,ec)。many(bulk)(ec))(ec)
是reactivemongo驱动程序的第一个代码段

这里,每个传入的批量都将转换为
未来
,并且所说的
未来
将在您提供的执行上下文中运行。只有在这一点上,下一个批量才会通过生成另一个
未来
来处理,依此类推

基本上,期货是按顺序运行的。这与

Flow[RandomCdr]
      .grouped(bulkSize)
      .mapAsync(parallelism = 1){ (bulk : Seq[RandomCdr]) =>
        collection.flatMap(_.insert[RandomCdr](false)(randomCdrWriter,ec).many(bulk)(ec))(ec)
      }
      .toMat(Sink.ignore)(Keep.right)
第二段代码

在这里,每个传入的批量都将转换为一个
未来
,它将在您提供的执行上下文中运行。
未来
将立即传递到
接收器。忽略
,其引用将被丢弃

使用此方法无法控制将同时运行多少个
Future
s。因此,不建议使用此方法


如果要寻找改进的并行性,请考虑使用<代码> MAPASYNC 如上所示,并调整并行性参数。

< P> <强>第一个片段< /强>

这里,每个传入的批量都将转换为
未来
,并且所说的
未来
将在您提供的执行上下文中运行。只有在这一点上,下一个批量才会通过生成另一个
未来
来处理,依此类推

基本上,期货是按顺序运行的。这与

Flow[RandomCdr]
      .grouped(bulkSize)
      .mapAsync(parallelism = 1){ (bulk : Seq[RandomCdr]) =>
        collection.flatMap(_.insert[RandomCdr](false)(randomCdrWriter,ec).many(bulk)(ec))(ec)
      }
      .toMat(Sink.ignore)(Keep.right)
第二段代码

在这里,每个传入的批量都将转换为一个
未来
,它将在您提供的执行上下文中运行。
未来
将立即传递到
接收器。忽略
,其引用将被丢弃

使用此方法无法控制将同时运行多少个
Future
s。因此,不建议使用此方法


如果你正在寻找改进的并行性,请考虑使用<代码> MAPASYNC 如上所示,并调整并行性参数。

这是否意味着第二个片段不提供背压?正确,它将尽可能多地发射未来,而没有背压。这意味着第二个片段不提供背压?正确,它是WI。我们将在没有背压的情况下尽可能多地发射未来导弹