Prześlij strumień plików do S3 przez Iteratee z Play2 / Scala
Przeczytałem kilka rzeczy na temat możliwości wysłania pliku do S3 przez Iteratee, który wydaje się pozwalać na wysyłanie fragmentów S3 pliku w miarę ich otrzymywania i unikania OutOfMemory dla dużych plików na przykład.
Znalazłem ten post SO, który prawdopodobnie jest prawie tym, co muszę zrobić:Odtwórz 2.x: Reaktywne przesyłanie plików za pomocą Iteratees Naprawdę nie rozumiem, jak to zrobić, czy też jest to naprawdę dostępne w Play 2.0.2 (ponieważ Sadek Brodi mówi, że foldM jest dostępny w Play 2.1 tylko na przykład)
Czy ktoś może to wyjaśnić w prosty sposób, dla kogoś, kto przeczytał bloga o Iteratees i nie jest jeszcze ekspertem Scala / Play2?
Nawet nie wiem, czy powinienem użyć wieloczęściowego parsera ciała, czy czegoś w tym rodzaju, ale jedno wiem, że nie rozumiem, co robi ten kod:
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(_)))
Przy okazji, jaka będzie różnica w zużyciu pamięci w porównaniu do klasycznego Java InputStream / OutputStream. Właściwie jestem w stanie przesłać plik 500 MB do S3 w sposób nieblokujący, z bardzo małym zużyciem pamięci, bez użycia Iteratees, używając Java + AsyncHttpClient + Grizzly (ale myślę, że działałoby to również z Netty).
Więc jaka jest zaleta korzystania z Iteratee?
Jedyną różnicą, jaką widzę, jest to, że wejście InputStream I do S3 jest w moim przypadku wspierane przez plik tymczasowy (jest to zachowanie CXF), więc może nie być tak reaktywne jak Play Iteratee
Ale w przypadku Iteratees, jeśli moduł wyliczający produkuje bajty odebrane przez połączenie i przekazuje je do S3 przez Iteratee, to jeśli połączenie z S3 nie jest dobre i bajty nie mogą być przekazane bardzo szybko, gdzie są przechowywane „oczekujące” bajty ?