Фьючерсы 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, нет никаких причин для такого поведения.

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