Документация для akka-http объясняет, что важно полностью использовать поток запросов, так как непереработанные байты будут интерпретироваться как противодавление (https://doc.akka.io/docs/akka-http/current/implications-of-streaming-http-entity.html). Когда вы заранее знаете, что поток можно игнорировать, вам следует используйте discardEntityBytes
или прочитайте его полностью другим способом. Существует также возможность закрытия соединения путем присоединения потока к Sink.cancelled
.
У меня вопрос, что происходит, когда поток не удается.
- Поток стекает или соединение закрыто? Или реализация несет ответственность за восстановление после ошибок и за утечку или закрытие соединения? Если так, что является хорошим шаблоном кода для этого?
- Имеет ли значение, если запрос завершен с
Future
или ответ потоковый?
- Что, если вместо неожиданного сбоя вы определите на середине пути, что остальная часть потока может быть проигнорирована. Является ли создание исключения хорошим способом остановки потоковой обработки?
Пример завершения с будущим:
val route =
post {
extractDataBytes { data =>
complete {
data
.via(flow1)
.via(flow2) // say error happens here at some point
.runwWith(sink)
}
}
}