Cuando se recibe una petición, por ejemplo una llamada a un API, es frecuente que para atenderla haya que que recabar información de múltiples orígenes. Estos orígenes pueden ser directamente un repositorio de información (un acceso JDBC), o bien, un servicio interno independiente que gestiona una determinada funcionalidad (microservice). Así mismo, algunas de estas informaciones serán independientes unas de otras, pero habrá casos en las que existan dependencias entre ellas. Por otro lado, sería muy interesante que no se bloquearan innecesariamente recursos del sistema (reactive), que son siempre muy escasos.
Por lo tanto, el sistema más eficiente sería aquel:
- que permitiera paralelizar todas las operaciones que fuera posible
- que permitiera combinar los resultados de operaciones intermedias para obtener el resultado final
- que evitara bloquear ningún recurso de manera innecesaria
En Scala esto es algo inherente al ADN del lenguaje, los elementos básicos del lenguaje proporcionan lo necesario, pero y en Java?
Supongamos un sistema de Gamificación en el que el API que devuelve el perfil del jugador proporciona la siguiente información:
- Datos básicos de perfil (nickname, nivel)
- Posición en los rankings
- Última medalla conseguida en su nivel actual
Por ejemplo, en este caso: los datos básicos del perfil y la posición en el ranking son operaciones independientes que podrían lanzarse sobre los correspondientes servicios, y la identificación de la última medalla conseguida depende de conocer previamente el nivel último nivel del usuario.
Scala Flavour
Scala ofrece las Futures como mecanismo para la parelización de acciones, y las operaciones flatMap y map para la combinación de las mismas dentro del propio lenguaje.
Las siguientes Futures modelizan las operaciones a realizar:
- Recuperación de la posición en el Ranking [fBasicProfile]
- Recuperación del perfil básico [fRanking]
- Recuperación de la última medalla del nivel actual [fLastMedalInLevel], que depende del valor devuelto por [fBasicProfile]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|