Virtual Threads, Thread Pools und Blocking IO
Virtual Threads sinnvoll einsetzen, klassische Pools verstehen und Blocking/Nonblocking sauber unterscheiden.
Virtual ThreadsThread PoolsJava 25Concurrency
Grundregel
Virtual Threads machen blockierenden Code skalierbarer, aber sie vergrößern nicht automatisch Datenbankpools, Broker-Limits oder Remote-System-Kapazität.
Typischer Fehler
Ein Team erhöht parallele Requests massiv, aber lässt den DB-Pool bei 20 Verbindungen. Ergebnis: Warteschlangen wandern nur an eine andere Stelle.
Beispiel
Virtual Threads mit externer Begrenzung
try (var executor = java.util.concurrent.Executors.newVirtualThreadPerTaskExecutor()) { var futures = customerIds.stream() .map(id -> executor.submit(() -> customerClient.loadCustomer(id))) .toList(); for (var future : futures) { handle(future.get()); } } // Wichtig: Remote-Limits, Timeouts und Bulkheads bleiben erforderlich.
Praxisübertragung auf das V4-Beispielprojekt
Entscheidung
Dokumentiere die getroffene Architekturentscheidung als ADR, inklusive Alternativen, Folgen und Betriebsrisiken.
Code-Nachweis
Markiere verwendete Entwurfsmuster direkt im Code und ergänze sie in docs/design-patterns.md.
Betrieb
Definiere Metrik, Alert, Runbook-Schritt und Rollback-Option für diesen Bereich.
Typische Fehlerbilder
- Framework-Feature wird eingesetzt, ohne fachliche Grenze zu verstehen.
- Technische Wiederholung wird nicht idempotent gemacht.
- Observability wird erst nach Produktionsproblem ergänzt.
- Tests prüfen nur Happy Path und keine Wiederanläufe.