Skip to content
Tillbaka till Portfolio
sqs-mini – Eventdriven Pipeline

sqs-mini – Eventdriven Pipeline

Backend-projekt som demonstrerar en eventdriven pipeline: ett Minimal API publicerar meddelanden till en AWS SQS-kö; en .NET Worker Service konsumerar dem med long polling, behandlar dem idempotent och routar fel till en DLQ. Infrastrukturen provisioneras i C# via Pulumi.

Min roll: Ensam utvecklare – backend och infrastrukturdesign
2026

Teknikstack

C# · .NET · AWS SQS · Pulumi · Minimal API · Worker Service · SQLite

Problem / Kontext

Meddelandeköer, retries och idempotenta konsumenter är mönster jag stötte på gång på gång i backend-arkitekturdiskussioner men aldrig byggt från grunden. sqs-mini är min fungerande implementation av hela flödet: ett Minimal API publicerar ett meddelande till SQS, en Worker Service hämtar det, behandlar det en gång (SQLite håller koll på redan sedda meddelande-ID:n) och allt som misslyckas tillräckligt många gånger hamnar i DLQ:n. Pulumi provisionerar hela AWS-uppsättningen i C# — samma språk som resten av projektet.

Lösning / Arkitektur

Projektet består av två .NET-applikationer: ett Minimal API (`SessionApi`) som fungerar som meddelandeproducer och en Worker Service (`BillingWorker`) som fungerar som konsument. Infrastrukturen – en SQS Standard Queue och dess DLQ – provisioneras med Pulumi i C#. Workern använder long polling för effektiv meddelandeemottagning, behandlar meddelanden idempotent med en SQLite-lagring för att spåra redan hanterade meddelande-ID:n, och låter SQS hantera retries och DLQ-routing för obehandlingsbara meddelanden. Runtimekonfiguration är miljöbaserad för att hålla kredentialer och kö-URL:er utanför källkoden.

Mål

  • Demonstrera ett realistiskt producer → queue → consumer-flöde
  • Provisionera AWS-infrastruktur deklarativt med Pulumi IaC i C#
  • Implementera long polling i en .NET Worker Service
  • Hantera idempotens med en SQLite-baserad meddelande-ID-lagring
  • Visa retries och dead-letter queue-beteende tydligt

Utmaningar

  • Designa ett idempotenslagring som är lättviktigt men tillförlitligt för demoändamålet
  • Konfigurera Pulumi för att provisionera SQS-köer med korrekt DLQ-koppling och retry-policy
  • Hantera miljöbaserad konfiguration rent utan att läcka hemligheter i källkoden

Viktiga tekniska beslut

  • Pulumi i C# för IaC – håller hela stacken i ett språk som teamet känner till
  • SQLite för idempotenslagring – noll infrastrukturkostnad för demo, enkel att byta mot Redis eller DynamoDB i produktion
  • Worker Service-mönster – det idiomatiska .NET-sättet för långvariga bakgrundskonsumenter
  • Minimal API för producer – lättviktigt och snabbt att sätta upp

Resultat / Effekt

  • En fungerande end-to-end eventdriven pipeline: API publicerar → SQS levererar → Worker konsumerar → DLQ fångar fel
  • Infrastruktur fullt reproducerbar med ett enda Pulumi-kommando
  • Demonstrerad förståelse för distribuerade systemmönster: idempotens, retries, DLQ, at-least-once delivery

Vad jag skulle förbättra härnäst

  • Ersätt SQLite-idempotenslagring med DynamoDB för en fullt molnbaserad lösning
  • Lägg till strukturerad loggning och observability med CloudWatch
  • Utöka till FIFO-kö för strikta ordningsgarantier

Skärmdumpar

Utforska det här projektet