Slide 1

Slide 1 text

Reactive Programming Königs- oder Irrweg? GEDOPLAN GmbH Dirk Weil

Slide 2

Slide 2 text

Dirk Weil GEDOPLAN GmbH, Bielefeld GEDOPLAN IT Consulting Softwareentwicklung, Beratung, Konzepte, Reviews GEDOPLAN IT Training Java, JEE, Tools u.v.a.m. in Berlin, Bielefeld, on-site JEE seit 1999 Speaker und Autor Reactive Programming - Königs- oder Irrweg? 2 gedoplan.de

Slide 3

Slide 3 text

Darum geht‘s Reactive Programming - Königs- oder Irrweg? 3 gedoplan.de

Slide 4

Slide 4 text

Das Problem zur Lösung Reactive Programming - Königs- oder Irrweg? 4 gedoplan.de

Slide 5

Slide 5 text

Burger-Service: 1) synchron Reactive Programming - Königs- oder Irrweg? 5 gedoplan.de @GET @Produces(MediaType.APPLICATION_JSON) public List getBurger(…) { Bun bun = bakeBun(supplyBunDough(…)); Patty patty = fryPattie(supplyPattyMeat(…)); List parts = List.of( bun.getUpperHalf(), getSauce(), getTomato(), getCheese(), pattie.toString(), getSalad(), bun.getLowerHalf()); return parts; Demo

Slide 6

Slide 6 text

Multitasking Reactive Programming - Königs- oder Irrweg? 6 gedoplan.de

Slide 7

Slide 7 text

Threads in Java java.lang.Thread führt ein Runnable aus Best practice: Executor / Thread Pool Auch für Callable Reactive Programming - Königs- oder Irrweg? 7 gedoplan.de // Start doSomething in new (platform) thread new Thread(this::doSomething).start(); Demo ExecutorService executor = Executors.newCachedThreadPool(); // Start doSomething in new (platform) thread executor.execute(this::doSomething);

Slide 8

Slide 8 text

Burger-Service: 2) mit Thread Pool Context Propagation -> ManagedExecutor Reactive Programming - Königs- oder Irrweg? 8 gedoplan.de @Inject ManagedExecutor executor; @GET @Produces(MediaType.APPLICATION_JSON) public List getBurger(…) throws ExecutionException, InterruptedException { Future bunFuture = executor.submit(() -> bakeBun(supplyBunDough(…))); … List parts = List.of( bunFuture.get().getUpperHalf(), getSauce(), Demo

Slide 9

Slide 9 text

Threads in Java OS Thread teuer Limitiert Reactive Programming - Königs- oder Irrweg? 9 gedoplan.de 13:35:55,932 INFO [d.g.s.ThreadDemo] 28,000 (561 ns/thread) Thread[#28036,Thread-27999,5,main] 13:35:56,798 INFO [d.g.s.ThreadDemo] 29,000 (572 ns/thread) Thread[#29036,Thread-28999,5,main] [17.306s][warning][os,thread] Failed to start thread "Unknown thread" - pthread_create failed (EAGAIN) for attributes: stacksize: 1 [17.306s][warning][os,thread] Failed to start the native thread for java.lang.Thread "Thread-29143" java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached at java.base/java.lang.Thread.start0(Native Method) at java.base/java.lang.Thread.start(Thread.java:1535) at de.gedoplan.showcase.ThreadDemo.thread(ThreadDemo.java:28) @#?!* Threads sparen non-blocking event-driven = reactive

Slide 10

Slide 10 text

Completion Stage Reactive Programming - Königs- oder Irrweg? 10 gedoplan.de CompletionStage ist ein Interface in der Java Standardbibliothek, das mit der Einführung von Java 8 im Paket java.util.concurrent hinzugefügt wurde. Das Interface ist Teil des neuen asynchronen Programmiermodells, das mit Java 8 eingeführt wurde, um die Parallelverarbeitung und die asynchrone Ausführung von Aufgaben zu erleichtern. Eine CompletionStage repräsentiert eine asynchrone Berechnung, die möglicherweise noch nicht abgeschlossen ist. Sie kann als ein Versprechen (Promise) betrachtet werden, das eine zukünftige Aktion oder einen zukünftigen Wert darstellt. Eine CompletionStage kann mit anderen CompletionStages verknüpft werden, um asynchrone Verarbeitungspipelines aufzubauen. Einige der Methoden, die in der CompletionStage-Schnittstelle definiert sind, umfassen das Anhängen von Aktionen, die nach Abschluss der asynchronen Berechnung ausgeführt werden sollen, und das Kombinieren von CompletionStages, um eine neue CompletionStage zu erstellen, die auf den Abschluss mehrerer anderer CompletionStages wartet. „ „

Slide 11

Slide 11 text

Completion Stage DSL für potenziell asynchrone Abläufe thenCompose  führe nacheinander aus thenCombine  führe parallel aus … modelliert Kontrollstrukturen … einige, nicht alle, die in Java möglich sind Burger-Service: 3) mit Completion Stages Reactive Programming - Königs- oder Irrweg? 11 gedoplan.de Demo

Slide 12

Slide 12 text

Project Loom: Virtual Threads Terminologie Reactive Programming - Königs- oder Irrweg? 12 gedoplan.de (Platform) Thread Wrapper für OS Thread Virtual Thread JVM-managed Thread Carrier Thread Platform Thread, auf den ein virtual Thread montiert werden kann Platform Thread Platform Thread Platform Thread Platform Thread OS Thread OS Thread OS Thread OS Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread … … … … mount / dismount wrap Fork/Join Pool

Slide 13

Slide 13 text

Project Loom: Virtual Threads Reactive Programming - Königs- oder Irrweg? 13 gedoplan.de // Start doSomething in new virtual thread Thread.ofVirtual().start(this::doSomething); ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor(); // ... executor.execute(this::doSomething); Thread unstarted = Thread.ofVirtual().unstarted(this::doSomething); // ... unstarted.start(); Demo

Slide 14

Slide 14 text

Burger-Service: 4) mit virtuellen Threads Achtung: Derzeit kein Managed Executor Reactive Programming - Königs- oder Irrweg? 14 gedoplan.de @GET @Produces(MediaType.APPLICATION_JSON) public List getBurger(…) throws ExecutionException, InterruptedException { ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor(); // Rest wie mit Standard-Threads Demo

Slide 15

Slide 15 text

Schneller, besser, schöner? JMH Benchmark: µs pro Burger Call (ohne Delays) Reactive Programming - Königs- oder Irrweg? 15 gedoplan.de 0 2.000 4.000 6.000 8.000 10.000 Sequenziell Platform Thread Completion Stage Virtual Thread 8.959 9.173 9.368 8.942

Slide 16

Slide 16 text

Project Loom: Virtual Threads Java 21 (Java 19/20 Preview) ☺ leichtgewichtig, klein, schnell ▪ Millionen von Threads pro JVM ☺ kein Pooling nötig / sinnvoll  kein Time Slicing ▪ nicht für CPU-intensive Tasks  können Platform Threads blockieren ▪ synchronized ▪ Native Calls Reactive Programming - Königs- oder Irrweg? 16 gedoplan.de

Slide 17

Slide 17 text

Unterstützung virtueller Threads in Frameworks Quarkus HTTP-based only RestEasy Reactive ➔ @RunOnVirtualThread Pinning problems Reactive Subsystems nutzen (z. B. JDBC) Helidon Níma Ersetzt Netty durch Virtual Thread based Web Server Derzeit Alpha, Release für Ende 2023 geplant Spring Boot AsyncTaskExecutor, Tomcat können auf Virtual Threads umkonfiguriert werden Insgesamt: Work in Progress! Reactive Programming - Königs- oder Irrweg? 17 gedoplan.de

Slide 18

Slide 18 text

Weitere Lösungsansätze Structured Concurrency (Java 21 Preview, Java 19 Incubate) Kotlin Coroutines Reactive Programming - Königs- oder Irrweg? 18 gedoplan.de val job1 = GlobalScope.launch { // do something asynchronously } val job2 = GlobalScope.launch { // do another thing asynchronously } runBlocking { joinAll(job1, job2); try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { SubTask task1 = scope.fork(this::job1); SubTask task2 = scope.fork(this::job2); scope.join();

Slide 19

Slide 19 text

Königs- oder Irrweg? Reactive Programming erzeugt „schwierigen“ Code Frameworks (REST Provider, REST Client, JDBC Driver, …) hoher Nutzungsgrad (wenige Entwickelnde / viele Nutzer) intern häufig ohnehin Event-basiert Reactive akzeptabel Anwendungen geringer Nutzungsgrad (individuell, viele verschiedene Anw.) Reactive ungünstig Reactive Programming - Königs- oder Irrweg? 19 gedoplan.de

Slide 20

Slide 20 text

More Demo-Projekte in github.com/GEDOPLAN quarkus-demo/quarkus-virtual-threads: Burger-Demo virtual-thread-demo: Allgemeine Thread-Demo gedoplan.de Trainings in Berlin, Bielefeld, Köln, inhouse Jakarta EE Intensiv Microservices mit Quarkus … gedoplan.de Reviews, Coaching, … Blog  [email protected] @dirkweil Reactive Programming - Königs- oder Irrweg? 20 gedoplan.de