Spray Chunked Request Throttle входящие данные
Я использую Spray 1.3, с incoming-auto-chunking-threshold-size
установить, чтобы разрешить потоковую передачу входящих запросов.
Когда от моего клиента поступает очень большой запрос, я хочу передать его через приложение и разгрузить его в резервное хранилище, чтобы ограничить объем памяти, используемый приложением Spray.
Я обнаружил, что Spray будет отбиваться в ответ так быстро, как может, создавая MessageChunk
с настроенного размера и передачи их в мое приложение.
Если внутреннее хранилище работает медленно, это приводит к тому, что Spray кэширует большую часть запроса в локальной памяти, что отрицательно сказывается на структуре потоковой передачи.
Можно ли каким-то образом заставить Spray блокировать или регулировать поток запросов, чтобы скорость входных данных соответствовала скорости выходных данных, чтобы ограничить использование памяти моим приложением?
Соответствующий код распыления:
Метод HttpMessagePartParser.parseBodyWithAutoChunking - это метод, который разбивает поток байтов запроса на MessageChunk
объекты. Он делает это жадно, потребляя столько кусков, сколько сразу доступно, затем возвращает NeedMoreData
объект.
Конвейер запросов принимает NeedMoreData
в методе handleParsingResult объекта RawPipelineStage
со следующим кодом:
case Result.NeedMoreData(next) ⇒ parser = next // wait for the next packet
... так что мне кажется, что нет никакого "вытягивающего" управления потоком чанкинга в Spray, и фреймворк всегда будет читать запрос настолько быстро, насколько это возможно, и отправлять его в Actors приложения как MessageChunk
s. Когда MessageChunk
сообщение в очереди для моего Actor
, его память не может быть кэширована на диск.
То есть нет способа ограничить память, используемую Spray для запроса?
1 ответ
Здесь обсуждается обходной путь: https://github.com/spray/spray/issues/281
Это может быть решено в будущем выпуске спрея.
РЕДАКТИРОВАТЬ: Spray теперь Akka HTTP, который имеет "Реактивные потоки", который создает обратное давление на поток TCP, оставаясь асинхронным: https://groups.google.com/forum/