Encaminhar um fluxo de upload de arquivos para o S3 através do Iteratee com o Play2 / Scala
Eu li algumas coisas sobre a possibilidade de enviar um arquivo para o S3 através do Iteratee, o que parece permitir enviar pedaços de S3 de um arquivo à medida que os recebo e evitar um OutOfMemory para arquivos grandes, por exemplo.
Eu encontrei este post que provavelmente é quase o que eu preciso fazer:Play 2.x: Upload de arquivo reativo com Iteratees Eu realmente não entendo como fazê-lo, ou se está realmente disponível no Play 2.0.2 (porque Sadek Brodi diz que foldM está disponível no Play 2.1 apenas por exemplo)
Alguém pode explicar isso de uma forma simples, para alguém que leu algum blog sobre Iteratees, e ainda não é um especialista em Scala / Play2?
Eu nem sei se devo usar um analisador de corpo com várias partes ou algo assim, mas uma coisa que eu sei é que não entendo o que esse código está fazendo:
val consumeAMB =
Traversable.takeUpTo[Array[Byte]](1028*1028) &>> Iteratee.consume()
val rechunkAdapter:Enumeratee[Array[Byte],Array[Byte]] =
Enumeratee.grouped(consumeAMB)
val writeToStore: Iteratee[Array[Byte],_] =
Iteratee.foldM[Array[Byte],_](connectionHandle){ (c,bytes) =>
// write bytes and return next handle, probable in a Future
}
BodyParser( rh => (rechunkAdapter &>> writeToStore).map(Right(_)))
By the way, qual será a diferença no consumo de memória em relação ao uso clássico Java InputStream / OutputStream. Eu realmente sou capaz de encaminhar um arquivo de 500 MB para o S3 de forma não-bloqueante, com um consumo de memória muito baixo, sem usar Iteratees, usando Java + AsyncHttpClient + Grizzly (mas eu acho que também funcionaria com Netty).
Então, qual é a vantagem de usar o Iteratee?
Uma diferença que posso ver é que o InputStream que recebo e encaminho para o S3 é, no meu caso, suportado por um arquivo temporário (esse é um comportamento do CXF), portanto pode não ser tão reativo quanto o Play Iteratee
Mas com o Iteratees, se o Enumerador produzir bytes recebidos pela conexão e encaminhá-los para o S3 através de um Iteratee, então se a conexão ao S3 não for boa e os bytes não puderem ser encaminhados com muita rapidez, onde são armazenados os bytes "pendentes" ?