Как изящно отключить http4s - PullRequest
3 голосов
/ 16 марта 2020

Я использую http4s BlazeServer 0.21, как я могу корректно завершить работу? Я хочу отклонить все предстоящие запросы и сохранить обработанные незавершенные запросы и ответы обратно в течение жесткого времени выключения.

Я попытался запустить сервер с serveWhile и установить shutdownHook SignallingRef. Поток сервера и промежуточное ПО откладываются, как и ожидалось (поэтому наши метрики и промежуточное ПО журнала все еще регистрируют этот ответ)

//serverStream
for {
  signal   <- fs2.Stream.eval(SignallingRef[F, Boolean](false))
  exitCode <- fs2.Stream.eval(Ref[F].of(ExitCode.Success))
  _        <- fs2.Stream.eval(shutdown(signal))
  server <- BlazeServerBuilder[F]
    .bindHttp(8080, "0.0.0.0")
    .withHttpApp(httpApp)
    .serveWhile(signal, exitCode)
} yield server
def shutdown[F[_]: Effect](interrupter: SignallingRef[F, Boolean]): F[Unit] = {
  LiftIO[F].liftIO(IO {
    sys.addShutdownHook {
      ...
      interrupter.set(true)
    }
  })
}
object Server extends IOApp {
  def run(args: List[String]): IO[ExitCode] =
    serverStream[IO].compile.drain.as(ExitCode.Success)
}

, но сервер http не работает, как я ожидаю, похоже на http4s Внутренний ServerChannel имеет свой собственный shutdownHook и отменяет все ответы уже.

какие-либо предложения / обходные пути? или просто способ удерживать и не убивать запросы в течение x секунд также приветствуется.

...