Gå til innhold

ADR-012: Velg TickerQ som scheduler for bakgrunnsjobber⚓︎

Kontekst og problemstilling⚓︎

User Story 20185 (Kai analyserer nye saker automatisk når de når ERS-status 0/1) krever en periodisk pollende jobb som henter saker fra Mimir og trigger workflow-analyse. ADR-006 (Queue-basert analyse) dekker meldings-drevet behandling, men dekker ikke tidsbaserte trigger.

Vi trenger: - Cron-schedulert eksekvering i .NET 10 - Persistens av job-state (overlever restart) - Monitorering/admin-grensesnitt for operasjonsteamet - Lokal utvikling uten ekstern infrastruktur

Relaterte beslutninger: ADR-003, ADR-006, ADR-011.

Nøkkeldrivere⚓︎

  • Schedulerte jobber må overleve Worker-restart
  • Driftsteam må kunne pause, retry'e og inspisere jobs uten kode-deploy
  • Persistens skal gjenbruke eksisterende Aspire-Postgres (ikke separat DB)
  • Tilstrekkelig dokumentert + vedlikeholdt for produksjonsbruk

Vurderte alternativer⚓︎

  1. TickerQ 10.3.0 — EF Core-basert scheduler med innebygd SignalR Dashboard
  2. Hangfire — Etablert .NET-scheduler, men dashbord-funksjonalitet bak betalvegg for advanced features
  3. Quartz.NET — Modent rammeverk, men ingen integrert dashboard
  4. BackgroundService + PeriodicTimer — Innebygd, ingen persistens, ingen UI

Beslutning⚓︎

Valgt: TickerQ 10.3.0 med TickerQ.EntityFrameworkCore mot eksisterende KaiDbContext.

Konsekvenser⚓︎

  • Positivt: integrert Dashboard uten ekstra avhengighet (SignalR-basert, gratis)
  • Positivt: EF Core operational store gjenbruker KaiDbContext → kun ett DB-skjema å vedlikeholde
  • Positivt: enkel DI-modell, lite boilerplate sammenlignet med Quartz
  • Negativt: TickerQ er relativt nytt (10.3.0); mindre community-størrelse enn Hangfire/Quartz. Risiko for breaking changes i fremtidige versjoner.
  • Nøytralt: krever at Worker-prosessen hoster en HTTP-pipeline (Dashboard er SignalR-basert) — Worker-prosjektet byttes fra Sdk.Worker til Sdk.Web.

Worker-prosjektets natur⚓︎

Worker er ikke lenger en ren BackgroundService-host, men en WebApplication som: - Hoster Dashboard på /tickerq - Eksponerer /health og /alive via ServiceDefaults - Kjører TickerQ-scheduleren via app.UseTickerQ()

Aspire-AppHost ruter HTTP-endepunktet eksternt med .WithExternalHttpEndpoints().

Implementasjonsplan⚓︎

Konkret implementasjon dekkes i ErsStatusPollingJob-spec og tilhørende plan.