Фьючерсы Scala продолжают работать после ответа в akka-http?
У меня есть служба REST, написанная в akka-http, которая предоставляет конечную точку / fire. Когда вызывается эта конечная точка, моя служба должна отправить файл, обычно ~50 МБ, другой службе. Но конечная точка / fire должна немедленно вернуться к вызывающей стороне и продолжить отправку файла асинхронно, методом "забей и забудь".
Моя реализация выглядит так
path("fire") {
post { request: FireRequest =>
complete {
sendFile(request.path)
StatusCodes.OK
}
}
}
}
def sendFile(path: String): Future[Unit] = Future {
// send the large file to another service
}
Я проверил это, и он отлично работает.
Однако при реализации аналогичного поведения в ASP.NET мне нужно было использовать стороннюю инфраструктуру (Hangfire) для обработки асинхронных задач, потому что потоки, сгенерированные по завершенному запросу, в конечном итоге были бы уничтожены.
Мой вопрос: в моем akka-http sendFile гарантированно будет работать до успешного / неудачного завершения, или будут случаи, в которых поток, в котором он выполняется, будет уничтожен?
1 ответ
Вероятно, это зависит от ExecutionContext, с которым вы работаете в будущем.
Если вы используете глобальный ExecutionContext, поведение заключается в том, чтобы Future продолжал работать даже после завершения запроса.
Насколько я знаю, я никогда не видел ни одного ExecutionContext, который бы убивал / прерывал / отменял поток Future в случае завершения запроса. Концепция завершения запроса не существует на уровне языка, но больше связана с вашей структурой уровня http, поэтому до тех пор, пока вы не используете ExecutionContext из структуры уровня http, нет никаких причин для такого поведения.