Переслать поток загрузки файлов на S3 через Iteratee с Play2 / Scala
Я читал некоторые материалы о возможности отправки файла на S3 через Iteratee, что, похоже, позволяет отправлять таким образом куски файла S3 по мере их получения и, например, избегать OutOfMemory для больших файлов.
Я нашел этот пост, который, вероятно, почти то, что мне нужно сделать: Play 2.x: загрузка файлов с помощью Iteratees Я не совсем понимаю, как это сделать, или же если это действительно доступно в Play 2.0.2 (потому что Садек Броди говорит, что foldM доступен в Play 2.1 только для примера)
Может ли кто-то объяснить это простым способом, для кого-то, кто читал какой-то блог об Итератах, и еще не является экспертом по Scala / Play2?
Я даже не знаю, должен ли я использовать многочастный синтаксический анализатор тела или что-то в этом роде, но я знаю одно: я не понимаю, что делает этот код:
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(_)))
Кстати, какая будет разница в потреблении памяти по сравнению с использованием классического Java InputStream / OutputStream. На самом деле я могу пересылать 500-мегабайтный файл на S3 неблокирующим способом, с очень низким потреблением памяти, без использования Iteratees, с использованием Java + AsyncHttpClient + Grizzly (но я думаю, это также будет работать с Netty).
Так в чем же преимущество использования Iteratee?
Одно отличие, которое я вижу, состоит в том, что InputStream, который я получаю и пересылаю в S3, в моем случае поддерживается временным файлом (это поведение CXF), поэтому он может быть не таким реактивным, как Play Iteratee.
Но в случае с итераторами, если перечислитель генерирует байты, полученные соединением, и пересылает их на S3 через итератора, тогда, если соединение с S3 не является хорошим, и байты не могут быть перенаправлены очень быстро, где хранятся «ожидающие» сообщения. байт?