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⚓︎
- TickerQ 10.3.0 — EF Core-basert scheduler med innebygd SignalR Dashboard
- Hangfire — Etablert .NET-scheduler, men dashbord-funksjonalitet bak betalvegg for advanced features
- Quartz.NET — Modent rammeverk, men ingen integrert dashboard
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.WorkertilSdk.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.