Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JConf Peru 2023 -Usando virtual threads para in...

JConf Peru 2023 -Usando virtual threads para incrementar dramáticamente la paralelización

En la última década, el uso de programación reactiva se ha incrementado para maximizar la concurrencia. Esto es debido al costo de tener un thread del sistema operativo para cada thread del lenguaje. Sin embargo, este enfoque suele llevar a código más difícil de mantener.

En esta charla veremos que incrementar la paralelización con threads virtuales es muy fácil. Esto nos permitirá tener muchos más de hilos concurrentes sin sacrificar la legibilidad del código. La cantidad de threads paralelos, se puede incrementar en varios órdenes de magnitud. Esto permitirá a su vez incrementar dramáticamente la cantidad de pedidos por segundo.

También hablaremos de los cuidados que hay que tener para aprovechar al máximo esta funcionalidad.

Todo esto ejemplificado con una demo de prueba.

Andres Alcarraz

Carlos Zela Bueno

December 04, 2023
Tweet

More Decks by Carlos Zela Bueno

Other Decks in Programming

Transcript

  1. Usando virtual threads para incrementar dramáticamente la paralelización de tu

    aplicación JConf Perú 2023 Andrés Alcarraz Sábado 2º de Diciembre de 2023 Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 1 / 31
  2. Acerca de mí 1 Acerca de mí 2 Un poco

    de historia Historia de la multitarea en Java El problema con los threads nativos La solución reactiva 3 Propiedades de los Virtual Threads Ventajas Desventajas Como se usan Que hacer Que no hacer 4 Detalles de implementación Pull request Thread.sleep 5 Frameworks 6 Más de project Loom 7 Ejemplo Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 2 / 31
  3. Acerca de mí Uruguayo 24 años desarrollando en Java. Ǜ

    [email protected] linkedin.com/in/andresalcarraz X/andresalcarraz github.com/alcarraz stackoverflow/3444205 Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 3 / 31
  4. Un poco de historia 1 Acerca de mí 2 Un

    poco de historia Historia de la multitarea en Java El problema con los threads nativos La solución reactiva 3 Propiedades de los Virtual Threads Ventajas Desventajas Como se usan Que hacer Que no hacer 4 Detalles de implementación Pull request Thread.sleep 5 Frameworks 6 Más de project Loom 7 Ejemplo Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 4 / 31
  5. Un poco de historia Historia de la multitarea en Java

    Green threads: Java 1.1. Todos los threads compartían un thread del sistema operativo. [Ora04] Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 5 / 31
  6. Un poco de historia Historia de la multitarea en Java

    Green threads: Java 1.1. Todos los threads compartían un thread del sistema operativo. [Ora04] Native threads: Introducidos en java 1.2 (1998) Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 5 / 31
  7. Un poco de historia Historia de la multitarea en Java

    Green threads: Java 1.1. Todos los threads compartían un thread del sistema operativo. [Ora04] Native threads: Introducidos en java 1.2 (1998) Executors: Introducidos en Java 5.0 (JEP 444 [Jep]). Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 5 / 31
  8. Un poco de historia Historia de la multitarea en Java

    Green threads: Java 1.1. Todos los threads compartían un thread del sistema operativo. [Ora04] Native threads: Introducidos en java 1.2 (1998) Executors: Introducidos en Java 5.0 (JEP 444 [Jep]). Thread pools: ya no hay que implementarlos a mano o depender de bibliotecas. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 5 / 31
  9. Un poco de historia Historia de la multitarea en Java

    Green threads: Java 1.1. Todos los threads compartían un thread del sistema operativo. [Ora04] Native threads: Introducidos en java 1.2 (1998) Executors: Introducidos en Java 5.0 (JEP 444 [Jep]). Thread pools: ya no hay que implementarlos a mano o depender de bibliotecas. Scheduling. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 5 / 31
  10. Un poco de historia Historia de la multitarea en Java

    Green threads: Java 1.1. Todos los threads compartían un thread del sistema operativo. [Ora04] Native threads: Introducidos en java 1.2 (1998) Executors: Introducidos en Java 5.0 (JEP 444 [Jep]). Thread pools: ya no hay que implementarlos a mano o depender de bibliotecas. Scheduling. Programación reactiva, nombre cool, pero lo cool termina ahí. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 5 / 31
  11. Un poco de historia Historia de la multitarea en Java

    Green threads: Java 1.1. Todos los threads compartían un thread del sistema operativo. [Ora04] Native threads: Introducidos en java 1.2 (1998) Executors: Introducidos en Java 5.0 (JEP 444 [Jep]). Thread pools: ya no hay que implementarlos a mano o depender de bibliotecas. Scheduling. Programación reactiva, nombre cool, pero lo cool termina ahí. Java 21: virtual threads, bloquear está bien de nuevo. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 5 / 31
  12. Un poco de historia El problema con los threads nativos

    Costosos de crear. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 6 / 31
  13. Un poco de historia El problema con los threads nativos

    Costosos de crear. Costosos de mantener. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 6 / 31
  14. Un poco de historia El problema con los threads nativos

    Costosos de crear. Costosos de mantener. En llamadas bloqueantes, los recursos quedan bloqueados. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 6 / 31
  15. Un poco de historia El problema con los threads nativos

    Costosos de crear. Costosos de mantener. En llamadas bloqueantes, los recursos quedan bloqueados. Veamos un ejemplo, ¡Coding time!. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 6 / 31
  16. Un poco de historia La solución reactiva Ejemplo tomado de

    José Paumard, que a su vez lo toma de Tomasz Nurkiewicz. [Pau23] User user = userService.findUserByName (name); if (!repo.contains (user)) repo.save (user); var cart = cartService.loadCartFor (user); var total = cart.items ().stream () .mapToInt (Item::price) .sum (); var transactionId = paymentService.pay (user, total); emailService.send (user, cart, transactionId); Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 7 / 31
  17. Un poco de historia La solución reactiva var future =

    supplyasync(() -> userService.findUserByName (name)) .thenCompose ( user -> allof( supplyAsync(() -> !repo.contains (user)) .thenAccept ( doesNotContain -> { if (doesNotContain) repo. save(user); } ), supplyAsync( () -> cartservice.loadCartFor (user) .thenapply ( cart -> supplyAsync(() -> cart.items ().stream ().mapToInt (Item::price).sum ()) .thenapply ( total -> paymentService.pay (user, total)) .thenAccept ( transactionId -> emailService.send (user, cart, transactionId) ) ) ) ) )
  18. Un poco de historia La solución reactiva Operaciones escritas como

    lambdas El resultado de una es pasado a la siguiente. No se debe bloquear en las lambdas. Cuando se está esperando por un recurso externo, retornar con un future. Adiós a la programación imperativa. La lógica de negocio se mezcla con la lógica del framework →complica cambios en la lógica de negocio. Si una lambda, genera un error en el framework, no es trivial descubrir cual fue. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 9 / 31
  19. Propiedades de los Virtual Threads 1 Acerca de mí 2

    Un poco de historia Historia de la multitarea en Java El problema con los threads nativos La solución reactiva 3 Propiedades de los Virtual Threads Ventajas Desventajas Como se usan Que hacer Que no hacer 4 Detalles de implementación Pull request Thread.sleep 5 Frameworks 6 Más de project Loom 7 Ejemplo Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 10 / 31
  20. Propiedades de los Virtual Threads Ventajas Solución nativa. Andrés Alcarraz

    Virtual Threads Sábado 2º de Diciembre de 2023 11 / 31
  21. Propiedades de los Virtual Threads Ventajas Solución nativa. Fáciles de

    usar. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 11 / 31
  22. Propiedades de los Virtual Threads Ventajas Solución nativa. Fáciles de

    usar. Livianos. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 11 / 31
  23. Propiedades de los Virtual Threads Ventajas Solución nativa. Fáciles de

    usar. Livianos. Código legible. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 11 / 31
  24. Propiedades de los Virtual Threads Ventajas Solución nativa. Fáciles de

    usar. Livianos. Código legible. No se necesita hacer pool de ellos. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 11 / 31
  25. Propiedades de los Virtual Threads Ventajas Solución nativa. Fáciles de

    usar. Livianos. Código legible. No se necesita hacer pool de ellos. Son todos de tipo daemon. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 11 / 31
  26. Propiedades de los Virtual Threads Ventajas Solución nativa. Fáciles de

    usar. Livianos. Código legible. No se necesita hacer pool de ellos. Son todos de tipo daemon. Revisitemos el ejemplo anterior. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 11 / 31
  27. Propiedades de los Virtual Threads Desventajas No hay una solución

    nativa para limitar el número de threads. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 12 / 31
  28. Propiedades de los Virtual Threads Desventajas No hay una solución

    nativa para limitar el número de threads. Por lo tanto no hay una forma trivial de limitar el acceso a un recurso. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 12 / 31
  29. Propiedades de los Virtual Threads Desventajas No hay una solución

    nativa para limitar el número de threads. Por lo tanto no hay una forma trivial de limitar el acceso a un recurso. Usar semáforos para controlar esto. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 12 / 31
  30. Propiedades de los Virtual Threads Desventajas No hay una solución

    nativa para limitar el número de threads. Por lo tanto no hay una forma trivial de limitar el acceso a un recurso. Usar semáforos para controlar esto. Se puede crear un executor personalizado para esto. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 12 / 31
  31. Propiedades de los Virtual Threads Como se usan Factory method

    en la clase Thread Thread virtual = Thread.ofVirtual ().start ( () -> System.out .println ("Hola Mundo!")); Con executors: ExecutorService service = Executors.newVirtualThreadPerTaskExecutor (); ... service.execute ( () -> System.out .println ("Hola Mundo!")); Por cierto, ExecutorService ahora implementa AutoCloseable. ¡Se puede utilizar en try-with-resources! Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 13 / 31
  32. Propiedades de los Virtual Threads Que hacer Bloquear está bien,

    ¡para eso están! Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 14 / 31
  33. Propiedades de los Virtual Threads Que hacer Bloquear está bien,

    ¡para eso están! Usarlos para tareas intensivas en el uso de recursos externos. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 14 / 31
  34. Propiedades de los Virtual Threads Que hacer Bloquear está bien,

    ¡para eso están! Usarlos para tareas intensivas en el uso de recursos externos. Operaciones en bases de datos. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 14 / 31
  35. Propiedades de los Virtual Threads Que hacer Bloquear está bien,

    ¡para eso están! Usarlos para tareas intensivas en el uso de recursos externos. Operaciones en bases de datos. Llamadas a servicios REST. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 14 / 31
  36. Propiedades de los Virtual Threads Que no hacer No usarlos

    para tareas que sólo hagan computación en memoria. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 15 / 31
  37. Propiedades de los Virtual Threads Que no hacer No usarlos

    para tareas que sólo hagan computación en memoria. No usarlos para ejecutar parallel streams. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 15 / 31
  38. Propiedades de los Virtual Threads Que no hacer No usarlos

    para tareas que sólo hagan computación en memoria. No usarlos para ejecutar parallel streams. No deberíamos ejecutar código bloqueante en parallel streams. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 15 / 31
  39. Propiedades de los Virtual Threads Que no hacer No usarlos

    para tareas que sólo hagan computación en memoria. No usarlos para ejecutar parallel streams. No deberíamos ejecutar código bloqueante en parallel streams. Evitar fijar el virtual thread a un platform thread por mucho tiempo. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 15 / 31
  40. Propiedades de los Virtual Threads Que no hacer No usarlos

    para tareas que sólo hagan computación en memoria. No usarlos para ejecutar parallel streams. No deberíamos ejecutar código bloqueante en parallel streams. Evitar fijar el virtual thread a un platform thread por mucho tiempo. No llamar a código nativo que pueda bloquearse. Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 15 / 31
  41. Propiedades de los Virtual Threads Que no hacer No usarlos

    para tareas que sólo hagan computación en memoria. No usarlos para ejecutar parallel streams. No deberíamos ejecutar código bloqueante en parallel streams. Evitar fijar el virtual thread a un platform thread por mucho tiempo. No llamar a código nativo que pueda bloquearse. No usar bloques synchronized para sincronizar cosas que pueden demorar. Usar ReentrantLock en su lugar Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 15 / 31
  42. Detalles de implementación 1 Acerca de mí 2 Un poco

    de historia Historia de la multitarea en Java El problema con los threads nativos La solución reactiva 3 Propiedades de los Virtual Threads Ventajas Desventajas Como se usan Que hacer Que no hacer 4 Detalles de implementación Pull request Thread.sleep 5 Frameworks 6 Más de project Loom 7 Ejemplo Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 16 / 31
  43. Detalles de implementación Fork join Pool .... Heap Andrés Alcarraz

    Virtual Threads Sábado 2º de Diciembre de 2023 17 / 31
  44. Detalles de implementación Fork join Pool .... Heap yield Andrés

    Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 18 / 31
  45. Detalles de implementación Fork join Pool .... Heap continue Andrés

    Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 19 / 31
  46. Detalles de implementación Pull request Se refactorizó todo el código

    bloqueante de la JDK, para llamar a Continuations.yield () Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 20 / 31
  47. Detalles de implementación Thread.sleep public static void sleep(long millis) throws

    InterruptedException { if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } long nanos = MILLISECONDS.toNanos (millis); ThreadSleepEvent event = beforeSleep(nanos); try { if (currentThread() instanceof VirtualThread vthread) { vthread.sleepNanos (nanos); } else { sleep0(nanos); } } finally { afterSleep(event); } }
  48. Frameworks 1 Acerca de mí 2 Un poco de historia

    Historia de la multitarea en Java El problema con los threads nativos La solución reactiva 3 Propiedades de los Virtual Threads Ventajas Desventajas Como se usan Que hacer Que no hacer 4 Detalles de implementación Pull request Thread.sleep 5 Frameworks 6 Más de project Loom 7 Ejemplo Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 22 / 31
  49. Frameworks Probablemente no tengas que escribir código para hacer uso

    de los virtual threads: Spring: spring.threads.virtual.enabled =true Quarkus: @RunOnVirtualThread Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 23 / 31
  50. Más de project Loom 1 Acerca de mí 2 Un

    poco de historia Historia de la multitarea en Java El problema con los threads nativos La solución reactiva 3 Propiedades de los Virtual Threads Ventajas Desventajas Como se usan Que hacer Que no hacer 4 Detalles de implementación Pull request Thread.sleep 5 Frameworks 6 Más de project Loom 7 Ejemplo Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 24 / 31
  51. Más de project Loom Structured Concurrency (Preview) JEP 453 Scoped

    Values (Preview) JEP 446 (second preview en Java 22: JEP 464) Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 25 / 31
  52. Ejemplo 1 Acerca de mí 2 Un poco de historia

    Historia de la multitarea en Java El problema con los threads nativos La solución reactiva 3 Propiedades de los Virtual Threads Ventajas Desventajas Como se usan Que hacer Que no hacer 4 Detalles de implementación Pull request Thread.sleep 5 Frameworks 6 Más de project Loom 7 Ejemplo Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 26 / 31
  53. Preguntas? 1 Acerca de mí 2 Un poco de historia

    Historia de la multitarea en Java El problema con los threads nativos La solución reactiva 3 Propiedades de los Virtual Threads Ventajas Desventajas Como se usan Que hacer Que no hacer 4 Detalles de implementación Pull request Thread.sleep 5 Frameworks 6 Más de project Loom 7 Ejemplo Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 28 / 31
  54. Referencias 1 Acerca de mí 2 Un poco de historia

    Historia de la multitarea en Java El problema con los threads nativos La solución reactiva 3 Propiedades de los Virtual Threads Ventajas Desventajas Como se usan Que hacer Que no hacer 4 Detalles de implementación Pull request Thread.sleep 5 Frameworks 6 Más de project Loom 7 Ejemplo Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 30 / 31
  55. Referencias [Jep] JEP 444: Virtual Threads. 2023. URL: https://openjdk.org/jeps/444 (visitado

    27-11-2023). [Ora04] Oracle. Concurrency Utilities Overview. 2004. URL: https: //docs.oracle.com/javase/1.5.0/docs/guide/concurrency/overview.html (visitado 27-11-2023). [Pau23] José Paumard. Java 21 new feature: Virtual Threads, RoadTo21. 2023. URL: https://youtu.be/5E0LU85EnTI?si=pX3tL808G2AsTOwK (visitado 01-12-2023). Andrés Alcarraz Virtual Threads Sábado 2º de Diciembre de 2023 31 / 31