Graceful Shutdown + Status Routes

TAS backend implementuje mechanismus pro bezpečné vypínání a poskytuje dedikované HTTP endpointy pro monitoring zdraví aplikace. Díky tomu může orchestrátor (Kubernetes, Docker Swarm) přesně řídit tok provozu — zastavit příjem requestů dříve, než začne samotné vypínání, a restartovat kontejner pouze tehdy, když aplikace skutečně přestane odpovídat.

Graceful Shutdown

Graceful shutdown se spustí při příjmu signálů SIGTERM nebo SIGINT. Cílem je dokončit všechny rozběhnuté požadavky, korektně uzavřít spojení a teprve poté ukončit proces — bez ztráty dat nebo přerušení aktivních transakcí.

Sekvence kroků — REST backend

  1. Nastaví se timeout dle konfigurace (system.backendTerminationTimeout). Po jeho vypršení se proces ukončí s exit(1).
  2. applicationStatus.readiness = false + applicationStatus.isShutdown = true — HTTP server přestane být označen jako ready, nové požadavky jsou odmítány přes hook isAlive (vrací HTTP 503).
  3. restServer.server.close() — uzavření Fastify HTTP serveru; čeká na dokončení in-flight requestů.
  4. container.connector.database.getConnection().close() — uzavření DB spojení.
  5. applicationStatus.liveness = false — liveness probe začne vracet UNAVAILABLE.
  6. process.exit(0)

Sekvence kroků — Cron worker

  1. Timeout stejný jako výše.
  2. applicationStatus.isShutdown = true + applicationStatus.readiness = false.
  3. cronScheduler.removeAll() — zastaví plánování nových cron jobů.
  4. cronScheduler.waitForAllRunningJobs() — počká na dokončení právě běžících jobů.
  5. restServer.server.close() — uzavření status HTTP serveru cronu.
  6. container.connector.database.getConnection().close() — uzavření DB.
  7. applicationStatus.liveness = false.
  8. process.exit(0)

Konfigurace timeoutu

Maximální dobu graceful shutdownu řídí konfigurační klíč system.backendTerminationTimeout (hodnota v sekundách). Pokud shutdown trvá déle než tento limit, proces se ukončí s exit(1).

isAlive hook

Middleware isAlive (soubor src/entrypoint/hooks/isAlive.ts) chrání všechny business endpointy. Pokud je liveness = false nebo isShutdown = true, vrátí HTTP 503 Service Unavailable.

Status endpointy /status/liveness a /status/readiness hook isAlive nepoužívají — jsou dostupné vždy, i během shutdownu.

Doporučení pro Kubernetes / Docker Swarm

Příklad konfigurace probe v Kubernetes manifestu:

livenessProbe:
httpGet:
path: /status/liveness
port: 3000
# zkontrolovat body: {"status": "OK"}

readinessProbe:
httpGet:
path: /status/readiness
port: 3000
# zkontrolovat body: {"status": "OK"}

  • Liveness probe — pokud vrátí UNAVAILABLE, orchestrátor kontejner restartuje.
  • Readiness probe — pokud vrátí UNAVAILABLE, orchestrátor přestane posílat traffic (loadbalancer drain), ale kontejner nerestartuje.
  • Deploy / rolling update — readiness se nastaví na true až po plném startu, takže na instanci, která ještě není připravena, nebude přesměrován žádný provoz.
  • Shutdown — readiness se nastaví na false okamžitě (stop traffic), liveness až po uzavření serverů.

Frantisek Brych Updated by Frantisek Brych

Technologická architektura

Contact

Team assistant (opens in a new tab)

Powered by HelpDocs (opens in a new tab)