Lärarguide · Lektion 6 av 10
SqlStreamStore & projektioner
Vi byter ut in-memory mot riktig persistens — utan att lämna MSSQL. En BackgroundService bygger en read model med checkpoints.
Skriv ut / Spara som PDF
Mål
Studenten konfigurerar MsSqlStreamStoreV3 mot riktig MSSQL.
Studenten implementerar StreamStoreEventStore : IEventStore.
Studenten har en projektion som BackgroundService med checkpoint.
Agenda
0:00
Recap in-memory ES. Vad är skillnaden mot riktig persistens?
0:15
Teori: SqlStreamStores schema (Streams, Messages). Varför en databas räcker.
0:45
Teori: projektion + checkpoint-tabell + all-stream subscription.
1:45
Workshop: migrera in-memory → SqlStreamStore + skapa AccountSummary-projection.
3:45
Diskussion: hur monitor:ar man projection-lag i produktion?
Talartips
Visa Streams- och Messages-tabellerna i SSMS direkt — det avmystifierar SqlStreamStore. Det är bara SQL.
Förklara att projektionen är en kopia. Det är OK. Den är optimerad för en specifik query och kan slängas och byggas om.
Påpeka att BackgroundService körs i samma process som API:t i kursen. I produktion är det vanligt att projektioner körs i en separat tjänst för skalning.
Workshop
Lägg till SqlStreamStore.MsSql-paket.
Initiera schemat: store.CreateSchemaIfNotExists().
Skapa StreamStoreEventStore som wrap:ar MsSqlStreamStoreV3.
Byt registrering: InMemoryEventStore → StreamStoreEventStore.
Skapa tabell dbo.AccountSummary + dbo.ProjectionCheckpoints.
Implementera AccountSummaryProjection : BackgroundService som loopar via ReadAllForwards.
Verifiera: POST deposit → SELECT från AccountSummary visar uppdaterat saldo.
Snabba Lägg till en till read model: TransactionHistory. Lägg in lag-metric (skillnad mellan checkpoint och all-stream head).
Stöd Förbered docker-compose med MSSQL. Ge SQL-scripten för tabellerna färdiga.
FAQ
Varför inte använda EventStoreDB?
Bra fråga som dyker upp varje kursomgång. Svar: vi vill ha en databas att hantera. EventStoreDB är fantastiskt — men kräver egen ops.
Är inte JSON i NVARCHAR(MAX) långsamt?
För kursens skala: nej. För miljarder events: ja, då är binär format + partitioning relevant.
Vad händer om projektionen kraschar mitt i?
Checkpoint-en uppdateras inte → vid omstart börjar den från senast committade checkpoint. Det är poängen. Detaljerna kring exactly-once tas i L7.
Fallgrop Studenter glömmer ofta att kalla CreateSchemaIfNotExists(). Lägg in det i en migrate-step.
Hemuppgift Övningar 1–3 lektion 06. Startskeleton till TicketHub-gruppuppgift.
Förberedelse till L7 Be studenterna fundera på "vad händer om två requests POST:ar samtidigt mot samma konto?" Det är L7:s krok.
← L5
L7 →