20 Enterprise Praxisfaelle mit Diagnose

Jeder Fall ist so aufgebaut, dass du nicht nur die Loesung liest, sondern Diagnose-Denken lernst.

← Zurueck zum Index

Fall 01: Outbox bleibt auf NEW

Fehlerbild

Outbox Tabelle enthaelt Events, aber status bleibt NEW

Wahrscheinliche Ursache

Relay-Job laeuft nicht oder kann RabbitMQ nicht erreichen

Diagnosebefehl oder SQL

select event_id,event_type,status,created_at from outbox.events order by event_id desc;

Weitere Pruefung

docker compose logs rabbitmq && grep OutboxRelay runtime.log

Loesung

Relay aktivieren, RabbitMQ URL pruefen, Credentials korrigieren

Enterprise-Lektion

Dual-Write-Probleme werden sichtbar, wenn Infrastruktur und DB nicht zusammenpassen.

Fall 02: RabbitMQ Queue bleibt leer

Fehlerbild

Outbox Event wird PUBLISHED, Queue hat aber 0 Messages

Wahrscheinliche Ursache

Exchange/Binding/Routing-Key passt nicht

Diagnosebefehl oder SQL

rabbitmqctl list_bindings && rabbitmqctl list_queues name messages

Weitere Pruefung

routing key order.accepted mit binding vergleichen

Loesung

definitions.json korrigieren und Container neu starten

Enterprise-Lektion

Messaging ist nur so gut wie seine Routing-Konventionen.

Fall 03: Consumer verarbeitet doppelt

Fehlerbild

Billing-Log zeigt gleiche Order mehrfach

Wahrscheinliche Ursache

Retry ohne Idempotency

Diagnosebefehl oder SQL

grep "Billing received" runtime.log

Weitere Pruefung

select aggregate_id,count(*) from outbox.events group by aggregate_id;

Loesung

Idempotency-Tabelle oder processed_events einbauen

Enterprise-Lektion

In Eventsystemen ist At-least-once normal, Idempotency ist Pflicht.

Fall 04: Keycloak liefert 401

Fehlerbild

API antwortet Unauthorized

Wahrscheinliche Ursache

Token fehlt, abgelaufen oder Issuer falsch

Diagnosebefehl oder SQL

curl -i http://localhost:8080/api/orders/ORD-1/accept

Weitere Pruefung

JWT exp/iss pruefen

Loesung

Token neu holen und issuer-uri korrigieren

Enterprise-Lektion

401 bedeutet Authentifizierung fehlt oder ist ungueltig.

Fall 05: Keycloak liefert 403

Fehlerbild

order-reader ruft Admin-POST auf

Wahrscheinliche Ursache

Token ist gueltig, Rolle reicht nicht

Diagnosebefehl oder SQL

curl -i -H "Authorization: Bearer $TOKEN" -X POST ...

Weitere Pruefung

realm_access.roles pruefen

Loesung

richtige Rolle zuweisen oder Policy anpassen

Enterprise-Lektion

403 bedeutet Identitaet bekannt, aber Berechtigung fehlt.

Fall 06: Flyway Migration bricht ab

Fehlerbild

Runtime startet nicht

Wahrscheinliche Ursache

SQL ist nicht idempotent oder Schema fehlt

Diagnosebefehl oder SQL

select * from flyway_schema_history order by installed_rank;

Weitere Pruefung

docker compose logs postgres

Loesung

Migration fixen, lokale DB neu aufsetzen oder repair bewusst nutzen

Enterprise-Lektion

Migrationen sind Produktionsartefakte, keine Wegwerfskripte.

Fall 07: Payment Timeout

Fehlerbild

POST accept haengt oder liefert 5xx

Wahrscheinliche Ursache

Provider langsam oder Netzwerkproblem

Diagnosebefehl oder SQL

curl -i -X POST http://localhost:8089/payment/authorize

Weitere Pruefung

WireMock delay mapping pruefen

Loesung

Timeout + Retry + Circuit Breaker konfigurieren

Enterprise-Lektion

Resilience macht Fehler kontrollierbar, nicht unsichtbar.

Fall 08: Circuit Breaker bleibt offen

Fehlerbild

Payment-Aufrufe werden sofort abgelehnt

Wahrscheinliche Ursache

Fehlerquote bleibt hoch oder Recovery-Fenster zu lang

Diagnosebefehl oder SQL

curl /actuator/metrics/resilience4j.circuitbreaker.state

Weitere Pruefung

Logs und Metriken pruefen

Loesung

Provider stabilisieren, Wartezeit pruefen, manuell verifizieren

Enterprise-Lektion

Circuit Breaker schuetzt das System, muss aber beobachtet werden.

Fall 09: Grafana zeigt keine Daten

Fehlerbild

Dashboard leer

Wahrscheinliche Ursache

Prometheus scrape nicht erfolgreich

Diagnosebefehl oder SQL

curl http://localhost:9090/api/v1/targets

Weitere Pruefung

/actuator/prometheus direkt pruefen

Loesung

Prometheus Target korrigieren

Enterprise-Lektion

Dashboard ohne Datenquelle ist nur Dekoration.

Fall 10: Prometheus Alert feuert nicht

Fehlerbild

keine Alerts sichtbar

Wahrscheinliche Ursache

Rule-Datei nicht geladen oder Ausdruck falsch

Diagnosebefehl oder SQL

curl http://localhost:9090/api/v1/rules

Weitere Pruefung

Prometheus Config reload pruefen

Loesung

Rule in prometheus.yml einbinden

Enterprise-Lektion

Alerts sind produktionskritische Dokumentation als Code.

Fall 11: Docker Compose startet nicht

Fehlerbild

Container bleibt Created/Restarting

Wahrscheinliche Ursache

Port belegt oder Volume kaputt

Diagnosebefehl oder SQL

docker compose ps && docker compose logs

Weitere Pruefung

lsof -i :5432 oder netstat

Loesung

Port freigeben, compose down -v nur lokal bewusst

Enterprise-Lektion

Lokale Labs scheitern oft an alten Volumes.

Fall 12: PostgreSQL Login falsch

Fehlerbild

Runtime kann DB nicht erreichen

Wahrscheinliche Ursache

Credentials stimmen nicht mit Compose oder App ueberein

Diagnosebefehl oder SQL

docker compose exec postgres psql -U order_user -d orderdb -c "select 1"

Weitere Pruefung

application.yml mit compose vergleichen

Loesung

Credentials vereinheitlichen

Enterprise-Lektion

Konfiguration ist Teil der Architektur.

Fall 13: Kubernetes Pod CrashLoopBackOff

Fehlerbild

Pod startet und beendet sich wieder

Wahrscheinliche Ursache

Config, Secret oder Probe falsch

Diagnosebefehl oder SQL

kubectl describe pod && kubectl logs

Weitere Pruefung

Events und env vars pruefen

Loesung

ConfigMap/Secret/Probe korrigieren

Enterprise-Lektion

CrashLoop ist ein Symptom, Events zeigen oft die Ursache.

Fall 14: Readiness Probe rot

Fehlerbild

Service routet nicht

Wahrscheinliche Ursache

App laeuft, ist aber nicht bereit

Diagnosebefehl oder SQL

curl /actuator/health/readiness

Weitere Pruefung

kubectl describe pod

Loesung

Health-Abhaengigkeiten pruefen

Enterprise-Lektion

Readiness entscheidet Traffic, nicht nur Prozessstart.

Fall 15: SBOM/Lizenzgate bricht ab

Fehlerbild

CI Pipeline stoppt

Wahrscheinliche Ursache

Abhaengigkeit mit unerwuenschter Lizenz

Diagnosebefehl oder SQL

mvn cyclonedx:makeAggregateBom

Weitere Pruefung

dependency tree anschauen

Loesung

Dependency ersetzen oder Lizenzentscheidung dokumentieren

Enterprise-Lektion

Lizenzthemen muessen vor Release sichtbar sein.

Fall 16: Maven Multi-Module Build bricht

Fehlerbild

package/class not found

Wahrscheinliche Ursache

Modulabhaengigkeit falsch

Diagnosebefehl oder SQL

mvn -pl runtime -am test

Weitere Pruefung

pom modules und dependencyManagement pruefen

Loesung

Modulgrenzen korrigieren

Enterprise-Lektion

Build-Reihenfolge folgt Architekturgrenzen.

Fall 17: Domain importiert Spring

Fehlerbild

Domain ist nicht mehr frameworkfrei

Wahrscheinliche Ursache

Architekturregel verletzt

Diagnosebefehl oder SQL

grep -R "org.springframework" maven-project/domain/src

Weitere Pruefung

ArchUnit-Regel oder Checkscript nutzen

Loesung

Import entfernen, Port definieren

Enterprise-Lektion

Clean Architecture ist konkret durch Imports pruefbar.

Fall 18: Backup kann nicht restored werden

Fehlerbild

Restore faellt erst im Ernstfall auf

Wahrscheinliche Ursache

Backup nie geprueft

Diagnosebefehl oder SQL

pg_restore --list backup.dump

Weitere Pruefung

Testrestore in leerer DB

Loesung

regelmaessige Restore-Uebung einbauen

Enterprise-Lektion

Ein Backup ohne Restore-Test ist nur Hoffnung.

Fall 19: Correlation ID fehlt

Fehlerbild

Logs nicht zusammenfuehrbar

Wahrscheinliche Ursache

Filter oder Logging Pattern fehlt

Diagnosebefehl oder SQL

curl -H "X-Correlation-Id: demo" ...

Weitere Pruefung

grep demo logs

Loesung

Filter und MDC-Logging aktivieren

Enterprise-Lektion

Ohne Korrelation ist Incident-Diagnose langsam.

Fall 20: DLQ waechst

Fehlerbild

Dead Letter Queue hat Nachrichten

Wahrscheinliche Ursache

Consumer scheitert dauerhaft

Diagnosebefehl oder SQL

rabbitmqctl list_queues name messages

Weitere Pruefung

Payload und Exception analysieren

Loesung

Replay-Script und Fix-Forward verwenden

Enterprise-Lektion

DLQ ist kein Muellkorb, sondern Arbeitsvorrat fuer Betrieb.

⌂ Cockpit