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.

V3 Tor
Vecka / Dag
4 h
Total tid
90 min
Teori
130 min
Workshop

Mål

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:30
Paus 15 min
1:45
Workshop: migrera in-memory → SqlStreamStore + skapa AccountSummary-projection.
3:45
Diskussion: hur monitor:ar man projection-lag i produktion?
4:00
Slut

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

  1. Lägg till SqlStreamStore.MsSql-paket.
  2. Initiera schemat: store.CreateSchemaIfNotExists().
  3. Skapa StreamStoreEventStore som wrap:ar MsSqlStreamStoreV3.
  4. Byt registrering: InMemoryEventStoreStreamStoreEventStore.
  5. Skapa tabell dbo.AccountSummary + dbo.ProjectionCheckpoints.
  6. Implementera AccountSummaryProjection : BackgroundService som loopar via ReadAllForwards.
  7. 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 →