Scala Akka流:在mapAsync完成数据处理之前调用onComplete

Scala Akka流:在mapAsync完成数据处理之前调用onComplete,scala,akka,future,akka-stream,Scala,Akka,Future,Akka Stream,我目前正在开发一个简单的批处理,它使用AKKA stream 1.0来处理数据。 如果我避免在流程步骤中使用mapAsync方法,所有这些都会顺利运行 调用on complete时,结果文件将最终确定,代理系统将通过收割者参与者关闭(请参见收割者模式): 我想加快的步骤之一是丰富数据的部分。有时,数据无法充实,下一步应该忽略 def enrich(implicit ec: ExecutionContext) : Flow[Data, EnrichedData, Unit] = Flow[Data

我目前正在开发一个简单的批处理,它使用AKKA stream 1.0来处理数据。 如果我避免在流程步骤中使用mapAsync方法,所有这些都会顺利运行

调用on complete时,结果文件将最终确定,代理系统将通过收割者参与者关闭(请参见收割者模式):

我想加快的步骤之一是丰富数据的部分。有时,数据无法充实,下一步应该忽略

def enrich(implicit ec: ExecutionContext) : Flow[Data, EnrichedData, Unit]
= Flow[Data].map(enriched.enrich(_)).collect {
 case Some(enrichedData) => enrichedData
}
所有这些代码都运行良好,在调用onComplete()时没有丢失元素

Input: 45639
Nb elements processed: 45639
Input: 45639
Nb elements processed: 45628
当我尝试使用mapAync和Future而不是map for enrichment步骤来加速时,会在处理所有元素之前调用onComplete

def enrich(implicit ec: ExecutionContext) : Flow[Data, EnrichedData, Unit]
   = Flow[Data].mapAsyncUnordered(8)(data => Future(enricher.enrich(data))).collect {
     case Some(enrichedData) => enrichedData
   }
我错过了最后的一些元素,而且从来没有相同的数字 所有这些代码都运行良好,在调用onComplete()时没有丢失元素

Input: 45639
Nb elements processed: 45639
Input: 45639
Nb elements processed: 45628
我找不到一个方法来发现所有的东西都被处理过。。。
知道我做错了什么吗?

我终于找到了问题所在。我的问题不在akka stream上,而是在一个不安全的限制检查器上。。。。谢谢你的帮助
对于那些感兴趣的人,我已经在github上上传了一些代码:

您是否也会丢失mapAsync的元素?IIRC失败的未来会使流崩溃,因此它不会以成功而失败告终我不会丢失mapAsync的元素(由计数器控制).如何维护计数器?我使用AtomicInteger完成了一个虚拟单例类,它是enricher中的增量。我可以看到enricher被称为45639(元素数)。元素丢失在写入进程的enricher之后,该进程使用一个actor将结果写入文件。它只接收~=45628,并调用onComplete。我怀疑mapAsyncUnordered+Future,因为当我在调用enricher时使用map时,编写器将接收所有元素,并在最后调用onComplete以完成结果文件。