Dette projekt er en løsning til mindre kode udfordring, for at få kendskab til ubekendte teknologier. Opgaven består i at udvikle et system med to .NET 8-applikationer (MessageProducer og MessageConsumer), der kommunikerer via en message broker (RabbitMQ) og gemmer udvalgte data i en PostgreSQL-database. Hele infrastrukturen (RabbitMQ, PostgreSQL, pgAdmin) køres lokalt via Docker Compose.
Kernefunktionalitet:
- MessageProducer: Sender kontinuerligt beskeder med et
Timestampog enCountertil en RabbitMQ-kø. - MessageConsumer: Lytter på køen og behandler beskeder:
- Kasserer beskeder ældre end 1 minut.
- Gemmer beskeder i PostgreSQL, hvis sekundet i
Timestamper lige (og < 1 min gammel). - Sender beskeder tilbage i køen med forøget
Counter, hvis sekundet er ulige (op tilMaxRetries, pt. 5).
Anvendte Teknologier:
- .NET 8 (Console Applications med Generic Host, DI, Logging, Configuration)
- RabbitMQ (via
RabbitMQ.ClientNuGet-pakke) - PostgreSQL (via
NpgsqlNuGet-pakke) - Docker & Docker Compose
- NUnit (til Unit Tests)
For at kunne bygge og køre projektet skal følgende være installeret:
- .NET 8 SDK (Version 8.0.405 eller nyere - se
global.json) - Docker Desktop (eller Docker Engine/CLI + Docker Compose på Linux)
Infrastrukturen (RabbitMQ, PostgreSQL, pgAdmin) startes nemt via Docker Compose:
-
Åbn en terminal eller kommandoprompt.
-
Navigér til roden af dette projekt (mappen hvor
docker-compose.ymlligger). -
Kør kommandoen:
docker-compose up -d
-dflaget starter containerne i "detached mode" (i baggrunden).- Første gang kan det tage lidt tid at downloade Docker images.
-
Vent et øjeblik på, at containerne starter helt op. Du kan tjekke status med
docker ps.
Applikationerne (MessageProducer og MessageConsumer) skal køres i separate terminalvinduer.
- Åbn to separate terminaler/kommandoprompter.
- Navigér til roden af projektet i begge terminaler.
- Eller bevæg dig ind i hver sub-mappe, og kør almindelig
dotnet run
- Eller bevæg dig ind i hver sub-mappe, og kør almindelig
- Terminal 1 (Producer): Kør følgende kommando for at starte
MessageProducer:dotnet run --project MessageProducer
- Terminal 2 (Consumer): Kør følgende kommando for at starte
MessageConsumer:dotnet run --project MessageConsumer
- Produceren vil begynde at sende beskeder (output kan være begrænset afhængig af log-niveau).
- Consumeren vil starte, forbinde og begynde at behandle beskeder fra køen (output viser behandlingslogik).
Stop Applikationerne: Tryk Ctrl+C i hver terminal for at stoppe Producer og Consumer pænt.
Stop Infrastruktur: Kør docker-compose down i terminalen fra projektets rodmappe for at stoppe og fjerne Docker-containerne. Data i PostgreSQL-databasen vil blive bevaret i et Docker volume (pgdata), medmindre du manuelt fjerner voluminet.
MessageProducer/: .NET 8 Konsolapplikation, der sender beskeder til RabbitMQ.MessageConsumer/: .NET 8 Konsolapplikation, der modtager og behandler beskeder fra RabbitMQ og interagerer med PostgreSQL.MessageShared/: .NET 8 Klassebibliotek, der indeholder den fællesMessage-klasse, som bruges af både Producer og Consumer.MessageConsumer.Tests/: NUnit-testprojekt til unit tests af logikken iMessageConsumer(primærtMessageHandler).docker-compose.yml: Definerer og konfigurerer Docker-containere for RabbitMQ, PostgreSQL og pgAdmin.appsettings.json/appsettings.Development.json: Konfigurationsfiler for applikationerne (RabbitMQ hostname, PostgreSQL connection string, log-niveauer).
Du kan tilgå management interfaces for RabbitMQ og pgAdmin via din browser:
-
RabbitMQ Management UI:
- URL: http://localhost:15672
- Bruger:
guest - Password:
guest - Her kan du se køen
Message-Queue, forbindelser, osv.
-
pgAdmin 4 (Database Admin Tool):
- URL: http://localhost:8080
- Bruger:
[email protected] - Password:
admin - NB: Første gang du logger ind, skal du manuelt tilføje en serverforbindelse til PostgreSQL-databasen:
- Klik "Add New Server".
- Giv den et navn (f.eks. "Local Docker Postgres").
- Gå til "Connection"-tabben:
- Host name/address:
localhost - Port:
5433(Bemærk: Ikke standard 5432 pga. mapping idocker-compose.yml) - Maintenance database:
messagesdb - Username:
appuser - Password:
secret
- Host name/address:
- Klik "Save".
- Du kan nu browse
messagesdb-databasen og semessages-tabellen.
Unit tests for MessageConsumer kan køres fra terminalen:
- Navigér til roden af projektet.
- Kør kommandoen:
dotnet test