Lärarguide · Lektion 8 av 10

Command-kö & undo

Per-aggregat single-writer-kö med Channel<T>. Undo via compensating events — aldrig genom att ta bort events.

V4 Tor
Vecka / Dag
4 h
Total tid
100 min
Teori
130 min
Workshop

Mål

Agenda

0:00
Recap concurrency. Vad om vi eliminerar race-condition genom serialisering?
0:15
Teori: GoF Command vs CQRS-command. Likhet: invokable + reifierad.
0:45
Teori: Channel<T> som single-writer per aggregat.
1:15
Teori: undo via compensating events. Aldrig delete.
1:40
Paus 15 min
1:55
Workshop: bygg AggregateCommandQueue + RevertDeposit.
3:45
Diskussion: vad händer med kön när processen kraschar? (in-process vs durable)
4:00
Slut

Talartips

Det ser ut som man kan "ta bort senaste event" för att ångra. Förklara varför det är fel: events är fakta. Att radera fakta = ljuga om historien. Undo = nytt event som kompenserar.
Visa Channel<T>-koden — den är bara 30 rader och pedagogiskt vacker.
Påpeka: kön är per aggregat-id. Olika konton kan processas parallellt; samma konto serialiseras.

Workshop

  1. Skapa CommandEnvelope med AggregateId + Command + TaskCompletionSource.
  2. Skapa AggregateCommandQueue som mappar id → Channel<CommandEnvelope>.
  3. Starta en background-task per kanal som läser sekventiellt.
  4. Lägg in RevertDepositCommand + MoneyDepositReverted-event.
  5. Demo: deposit 100, deposit 50, revert första deposit → saldo = 50.
  6. Bevisa ordning: skicka 1000 paralella commands på samma id, verifiera serialiserad processing via test.

Snabba

  • Lägg in priorities i kön.
  • Lägg in metrics: kö-djup per aggregat.

Stöd

  • Tillhandahåll Channel<T>-skelett.
  • Para för pair-programming under workshop.

FAQ

Vad händer om servern dör med commands i kön?
In-process Channel förlorar kön. För durability: outbox-tabell eller broker (RabbitMQ/Azure Service Bus). Lyft som "production concern".
Behöver vi fortfarande Polly om vi har kön?
Sannolikt nej för concurrency, men retry är bra mot transient I/O. Kön löser concurrency-konflikter.
Kan man ångra ett revert?
Ja — ny deposit. Det är linjär historik framåt. Undo-undo = redo.
Fallgrop Studenter försöker dela en Channel mellan aggregat. Förklara varför det dödar parallellismen och inte ger korrekt ordning.
Hemuppgift Övningar 1–3 lektion 08. Bygg ut TicketHub-gruppuppgift med kö + undo.
Förberedelse till L9 Repetera SqlStreamStore-prestanda. Snapshots aktualiseras när streams blir >10k events.

← L7 L9 →