70 lines
2.7 KiB
Markdown
70 lines
2.7 KiB
Markdown
# Master 16: High-Concurrency URL Shortener & Analytics Microservice API 🏆
|
|
|
|
Willkommen zum **Master-Abschlussprojekt** des Go Cloud Microservices & Systems Lehrgangs!
|
|
|
|
In diesem Abschlussprojekt baust du einen produktionsreifen Cloud-Microservice: Einen **High-Concurrency URL Shortener mit asynchroner Analytics Ingestion Engine**.
|
|
|
|
---
|
|
|
|
## 🏛️ 1. Architektur & Konzepte
|
|
|
|
Dieses Projekt vereint alle zentralen Kernkompetenzen von Go:
|
|
1. **Goroutine Worker Pool (`sync.WaitGroup`)**: Ein Pool dedizierter Worker-Goroutines verarbeitet Klick-Events im Hintergrund, ohne HTTP-Antworten zu verzögern.
|
|
2. **Buffered Channels**: Dienen als stoßfester In-Memory Event-Bus für Klick-Analysen.
|
|
3. **Thread-Safe State (`sync.RWMutex` & `sync/atomic`)**: Schnelle parallele Lesezugriffe beim URL-Lookup und atomare Metrik-Zähler ohne Lock-Overhead.
|
|
4. **RESTful HTTP API (`net/http`)**: Vollständige JSON API mit Request Decoding, Validierung und Statuscodes.
|
|
5. **Middleware Pipeline**: Recovery- und Logging-Middlewares schützen den Dienst vor unerwarteten Panics.
|
|
6. **Integration & Concurrency Tests**: Stresstest mit parallelen Schreibern und Lesern.
|
|
|
|
---
|
|
|
|
## 📡 2. Endpunkte & Datenformate
|
|
|
|
### `POST /api/shorten`
|
|
- **Request Body**: `{"url": "https://golang.org/doc"}`
|
|
- **Response (201 Created)**: `{"id": 1, "short_code": "a1b2c3", "original_url": "https://golang.org/doc", "created_at": "...", "click_count": 0}`
|
|
|
|
### `GET /r/{short_code}`
|
|
- Löst den Kurzcode auf.
|
|
- Reiht asynchron ein `ClickEvent` in die Queue ein.
|
|
- Liefert Status `302 Found` (Redirect) oder `200 OK` mit JSON `{"original_url": "..."}`.
|
|
|
|
### `GET /api/stats/{short_code}`
|
|
- **Response (200 OK)**:
|
|
```json
|
|
{
|
|
"short_code": "a1b2c3",
|
|
"total_clicks": 142,
|
|
"unique_ips": 38
|
|
}
|
|
```
|
|
|
|
### `GET /api/metrics`
|
|
- **Response (200 OK)**:
|
|
```json
|
|
{
|
|
"total_urls": 12,
|
|
"total_clicks_processed": 540,
|
|
"active_workers": 4,
|
|
"queue_length": 0
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 Aufgaben in `aufgabe.go`
|
|
|
|
1. **TODO 1 (`Structs`)**: Definiere die Datenmodelle `URLRecord`, `ClickEvent`, `AnalyticsStats` und `SystemMetrics` mit JSON-Tags.
|
|
2. **TODO 2 (`WorkerPool`)**: Implementiere `StartWorkerPool(numWorkers int)` und `StopWorkerPool()` mit `sync.WaitGroup` und Channel-Close.
|
|
3. **TODO 3 (`ShortenURL`)**: Validiere die URL, generiere einen deterministischen oder Zufalls-ShortCode und speichere den Eintrag thread-safe.
|
|
4. **TODO 4 (`ResolveURL`)**: Finde die URL und dispatche ein `ClickEvent` nicht-blockierend (mit `select / default`) an die Worker-Queue.
|
|
5. **TODO 5 (`GetStats`)**: Berechne Klicks und Unique IPs aus der Analytics-Tabelle.
|
|
6. **TODO 6 (`SetupMicroserviceRouter`)**: Registriere alle Endpunkte und binde die Middleware-Kette an.
|
|
|
|
---
|
|
|
|
## 🧪 Tests ausführen
|
|
|
|
```bash
|
|
go test -v -race ./...
|
|
```
|