Event-driven-Architektur mit Go: Reaktive Systeme der Zukunft bauen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum Event-driven-Architektur mit Go der neue schwarze Gürtel in der Entwicklung ist?

\n\n

Stellen Sie sich ein Orchester vor, in dem jeder Musiker seinen eigenen Part spielt, ohne auf den Dirigenten zu warten, und dennoch eine perfekte Symphonie erschafft. Genau so funktioniert die Event-driven-Architektur mit Go – jeder Dienst lebt sein eigenes Leben, reagiert auf Ereignisse und produziert neue, ohne den Gesamtfluss zu blockieren.

\n\n

In einer Welt, in der Nutzer sofortige Reaktionen verlangen und Systeme Millionen von Anfragen pro Sekunde verarbeiten, beginnen synchrone REST-APIs zu "ersticken". Go mit seinen leichtgewichtigen Goroutinen und der nativen Unterstützung für Nebenläufigkeit wird zur idealen Sprache für den Aufbau reaktiver Systeme. Aber wie verwandelt man das Chaos asynchroner Aufrufe in eine saubere Architektur? Lassen Sie es uns herausfinden.

\n\n

Was ist Event-driven-Architektur (EDA) und warum Go?

\n\n

Event-driven-Architektur mit Go ist ein Paradigma, bei dem Systemkomponenten über Ereignisse kommunizieren, nicht über direkte Aufrufe. Anstatt dass Dienst A auf eine Antwort von Dienst B wartet, veröffentlicht er einfach eine Nachricht in einem Broker, und Dienst B nimmt sie auf, wenn er bereit ist.

\n\n

Warum ist Go ideal für EDA?

\n
    \n
  • Goroutinen – günstige "Threads" für die parallele Ereignisverarbeitung (eine Million lassen sich problemlos starten)
  • \n
  • Kanäle – eingebauter Mechanismus zur Übertragung von Ereignissen zwischen Goroutinen
  • \n
  • Schnelle Kompilierung – Iterationen in Microservices werden blitzschnell
  • \n
  • Einfachheit – weniger "Magie", mehr Kontrolle
  • \n
\n\n

Unser erstes Event-driven-System mit Go aufbauen: vom Einfachen zum Komplexen

\n\n

Stufe 1: Interne Ereignisse über Kanäle

\n

Beginnen wir mit den Grundlagen. Stellen Sie sich vor, wir schreiben ein Server-Überwachungssystem. Jedes Ereignis (Speicherabfall, CPU-Anstieg) muss asynchron verarbeitet werden.

\n\n
package main\n\nimport (\n    "fmt"\n    "math/rand"\n    "time"\n)\n\ntype Event struct {\n    Type    string\n    Payload interface{}\n}\n\nfunc main() {\n    // Kanal für Ereignisse erstellen\n    eventChannel := make(chan Event, 100)\n    \n    // Producer: Ereignisse generieren\n    go func() {\n        for {\n            time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)\n            event := Event{\n                Type: "system.memory.alert",\n                Payload: map[string]interface{}{\n                    "usage_pct": rand.Float64() * 100,\n                    "timestamp": time.Now(),\n                },\n            }\n            eventChannel <- event\n        }\n    }()\n    \n    // Consumer: Ereignisse verarbeiten\n    go func() {\n        for event := range eventChannel {\n            fmt.Printf("Ereignis empfangen: %s\\n", event.Type)\n            processEvent(event)\n        }\n    }()\n    \n    time.Sleep(5 * time.Second)\n}\n\nfunc processEvent(e Event) {\n    // Verarbeitung simulieren\n    time.Sleep(200 * time.Millisecond)\n    fmt.Printf("Verarbeitet: %v\\n", e.Payload)\n}
\n\n

Das ist die Basis, aber für die Produktion wird mehr benötigt. Wenn die Anzahl der Dienste in die Dutzende geht, kommen Message Broker ins Spiel.

\n\n

Stufe 2: Event-driven-Architektur mit Go und NATS

\n

NATS ist ein leichtgewichtiger Broker, der sich hervorragend mit Go versteht. Er ist schneller als RabbitMQ und einfacher als Kafka.

\n\n
package main\n\nimport (\n    "log"\n    "time"\n    "github.com/nats-io/nats.go"\n)\n\ntype OrderEvent struct {\n    OrderID string    `json:"order_id"`\n    Status  string    `json:"status"`\n    Amount  float64   `json:"amount"`\n    Time    time.Time `json:"time"`\n}\n\nfunc main() {\n    // Mit NATS verbinden\n    nc, err := nats.Connect(nats.DefaultURL)\n    if err != nil {\n        log.Fatal(err)\n    }\n    defer nc.Close()\n    \n    // Ereignis veröffentlichen (Producer)\n    event := OrderEvent{\n        OrderID: "ORD-12345",\n        Status:  "created",\n        Amount:  299.99,\n        Time:    time.Now(),\n    }\n    \n    data, _ := json.Marshal(event)\n                

Blogs

Buchempfehlungen