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 приложения как MessageChunks. Когда MessageChunk сообщение в очереди для моего Actor, его память не может быть кэширована на диск.

То есть нет способа ограничить память, используемую Spray для запроса?

1 ответ

Решение

Здесь обсуждается обходной путь: https://github.com/spray/spray/issues/281

Это может быть решено в будущем выпуске спрея.

РЕДАКТИРОВАТЬ: Spray теперь Akka HTTP, который имеет "Реактивные потоки", который создает обратное давление на поток TCP, оставаясь асинхронным: https://groups.google.com/forum/

Другие вопросы по тегам