Temporal.io
En esta ocasión, nuestros Hunters nos hablan de Temporal: un orquestador de flujos de trabajo que permite centralizar toda lógica de negocio asegurando un funcionamiento distribuido de forma fiable, incluso ante fallos como caídas de red o servidores.
En la mayoría de los programas con grandes flujos de trabajo, especialmente aquellos compuestos por múltiples microservicios, es bien sabida la dificultad de su correcta organización y gestión. Hay que tener en cuenta tanto el estado en el que se encuentra cada uno de estos, como en la tolerancia a fallos del sistema o su correcto funcionamiento de principio a fin. Es indiscutible que toda aplicación busca la mayor estabilidad, seguridad y fiabilidad, pero llegar a obtenerlas no siempre es sencillo.
¿Qué ofrece Temporal.io?
Una vez definida la funcionalidad general a la que se dedica el orquestador Temporal, se puede entrar en detalle en cuáles son todas las ventajas que ofrece de manera más concreta:
-Temporal se encarga del estado de ejecución de todos los flujos en cualquier momento del mismo, obteniendo los beneficios de una máquina de estado pero sin la complejidad añadida de esta. Es capaz de coordinar múltiples servicios distribuidos asegurando diferentes cualidades comentadas en los siguientes puntos.
-Se puede definir con facilidad políticas de reintentos, permitiendo reaccionar ante fallos en la ejecución incluso con el margen temporal que se desee sin tener que programarlo directamente. Estos reintentos son automáticos y pueden definirse políticas para los mismos, especificando características concretas de qué, cuándo y cómo reintentar procesos.
-Al igual que los márgenes de tiempo en el reintento de ejecución se puede personalizar a gusto del desarrollador, también se puede usar Temporal para establecer timers dentro del Workflow, pausando su ejecución o definiendo timeouts para actividades o flujos completos.
-Con temporal también se pueden olvidar los cron-jobs en la mayoría de los casos, ya que la herramienta permite organizar Workflows con esta misma función. Además su estado persiste automáticamente paso a paso y son reanudables tras el último paso ejecutado tras una interrupción del proceso.
-Uno de los puntos fuertes más importantes de Temporal es la naturaleza de su funcionamiento: Todo el flujo se define con código imperativo, facilitando su creación considerablemente.
-Temporal además ofrece la posibilidad de utilizarse tanto en SDKs de Go, Java, TypeScript, .NET, PHP, Python y Ruby.
Funcionamiento de su Temporal Web UI:
Temporal cuenta con una interfaz web que permite a los usuarios ver los estados y los metadatos de sus Workflows y sus respectivas ejecuciones en todo momento con el objetivo de debuggear. A continuación se detalla información sobre cómo funciona.
Para ejecutarlo se debe crear un servicio de Temporal que incluye su interfaz web, un namespace y una base de datos (aunque si es para pruebas, se puede crear un servicio que utilice como base de datos la memoria del ordenador, haciendo que no sea persistente).
Comando para levantar el servicio:
temporal server start-dev –ui-port PUERTO –db-filename BD_Temporal.db
Comando para levantar el servicio sin persistencia de datos (prueba):
temporal server start-dev
Una vez hecho esto además de haber levantado el programa que utilice Temporal, se podrá acceder desde el puerto especificado, por ejemplo http://localhost:8080.
Una vez allí, se tiene acceso a una serie de métricas y registros. Se procede a desglosar cada apartado para explicar de qué se trata:
- Workflows: En esta pestaña se administra la ejecución de los Workflows. Se tiene información detallada sobre ellos como las entradas y resultados registrados, así como un historial de eventos realizados junto con una lista de los mismos, especificando fechas y detalles de cada uno. Aparte de observar esta información, desde aquí se puede cancelar, terminar o señalizar los Workflows en ejecución.
- Schedules: Aquí se encuentran los Workflows que han sido porgramados (cron-style) y donde se podrán pausar, reanudar, editar o eliminar.
- Batch: Se pueden realizar acciones en lote sobre muchos Workflows al mismo tiempo.
- Deployments: Aquí se administran los deployments de Workflows, el control de la versión del código y el soporte tanto para rollbacks como upgrades.
- Archive: Muestra los Workflows archivados, guardados a largo plazo sin estar ya presentes en memoria.
A partir de aquí existen otras pestañas más genéricas que no están directamente relacionadas con los Workflows:
- Namespaces. En esta se puede ver una lista de los Namespaces donde corren los Workflows y algunos datos sobre estos. Por defecto existirá el namespace Default.
- Nexus: Nueva funcionalidad que permite conectar con servicios externos (como APIs o Dbs) usando conectores para consumir datos externos como Activities sin código.
- Import: Carga Workflows previamente exportados o definidos.
- Docs: Lleva directamente a la documentación oficial de Temporal.
- Feedback: Se trata de simplemente un formulario para enviar sugerencias o reportar problemas con la UI.
A continuación se va a explicar más detenidamente la pestaña que más interesa: la de los Workflows. Pero antes de eso se debe poner en marcha uno para poder visualizarlo. Se va a utilizar un pequeño ejemplo de transacción de pago para comenzar a utilizar la aplicación web.
Lo primero que se debe hacer es tener listo un proyecto con Temporal que sea funcional. En este caso se tiene un programa en Java que inicia el Workflow MoneyTransferWorkflow. Este Workflow representa una transferencia de dinero entre dos cuentas (de manera simplificada).
La función main de la aplicación se encargará de lo siguiente:

Función main donde se iniciará el Workflow
Hablando más detenidamente acerca de lo que hace este Workflow, se puede analizar el código de su clase:
1. Se orquestan diferentes pasos de negocio, tales como retirar, depositar o devolver.

Función que gestiona cada uno de los diferentes procesos a realizar como transacción.
2. Se comprueba el manejo de errores de Temporal, ya que se utiliza el método RetryOptions para configurar reintentos automáticos.

Función introducida en la clase MoneyTransferWorkflowImpl para gestionar las opciones de reintento
3. También se puede comprobar que si algo falla, el Workflow se reanudará automáticamente gracias a Temporal.

Función introducida en la clase MoneyTransferWorkflowImpl para comprobar el funcionamiento de cierto proceso.
Una vez habiendo desglosado todo el código de la función principal se podrá ejecutar el programa y comprobar qué se visualiza en la Temporal Web UI. Para lanzarlo, además de tener levantado el servicio de Temporal anteriormente explicado, también se tiene que ejecutar el Workflow:
mvn compile exec:java -Dexec.mainClass="moneytransferapp.TransferApp" -Dorg.slf4j.simpleLogger.defaultLogLevel=warn
Una vez hecho esto, se habrá realizado una transacción que servirá de ejemplo para utilizar el Web UI:

Resultado de la compilación de TransferApp.java

Visualización del Workflow generado al compilar la aplicación de TransferApp.java
Ahora se tiene información sobre el Workflow lanzado, pero como bien dice Temporal, no hay Workers en funcionamiento y sin ellos no se pueden ejecutar los Workflows. Se debe ejecutar lo siguiente:
mvn compile exec:java -Dexec.mainClass="moneytransferapp.MoneyTransferWorker" -Dorg.slf4j.simpleLogger.defaultLogLevel=warn
Ahora que se tiene un Worker escuchando a la cola de tareas del Workflow en ejecución, devolverá los resultados al servidor de Temporal.

Resultado obtenido tras habilitar un Worker que procese las actividades del Workflow en TransferApp.java
Visualización del nuevo Worker en ejecución trabajando con el Workflow previamente creado
En resumen, el orden de procesamiento consiste en:
- El Worker busca una primera tarea para ejecutar en el Workflow.
- Una vez la ejecuta y comunica los eventos al servidor de Temporal.
- Esto hace que el servidor mande tareas a la cola de tareas.
- El Worker entonces coge cada una de esas actividades encoladas y las ejecuta en orden.

Visualización de las actividades encoladas y ejecutadas gracias al Worker.

En esta misma pestaña podemos ver otras métricas como el historial de eventos del Workflow o sus datos de entrada/salida
Comparativa entre Temporal y Camunda 8:
En la actualidad existen varias herramientas que permiten lo mismo que Temporal y una de las más reconocidas al respecto es Camunda 8, por lo que una de las grandes dudas a la hora de elegir cómo se orquestarán las aplicaciones es poner en comparativa las diferentes prestaciones de cada producto en el mercado actual. A continuación se compararán las diferentes características de ambas:
- Interfaz VS código: Si bien es cierto que Temporal cuenta con una interfaz web que provee con información al usuario, todo lo que debemos implementar se realiza a través de código. En contraposición, Camunda utiliza un editor visual (BPMN) donde podremos arrastrar y soltar diferentes funciones para crear los propios Workflows, teniendo una curva de dificultad más sencilla pero sacrificando algo de flexibilidad frente al enfoque programático de Temporal.
- Centralizado VS Descentralizado: Camunda 8 utiliza un motor de flujos basado en colas de eventos, diseñado para escalabilidad, pero con una separación clara entre motor y servicios, mientras que en Temporal usa un modelo de ejecución descentralizado de Workflows donde cada Worker puede ser distribuido a través de múltiples máquinas y localizaciones con mayor descentralización.
- Orientado a eventos VS no orientado a eventos: Temporal, al contrario que Camunda 8, hace especial énfasis en crear Workflows reactivos, con listeners y ejecuciones por eventos externos. Si bien Camunda también permite Workflows orientados a eventos, hace menor énfasis en comparación.
- Enfoque escalable VS enfoque no escalable: Al igual que en la anterior funcionalidad, Camunda también soporta escalabilidad horizontal, pero no estaba diseñado específicamente para ello hasta su versión 8 donde sí es posible. Por otra parte Temporal está preparado para Workflows a gran escala que requieren gran escalabilidad y tolerancia a fallos, con aun mayor foco en esta tarea que el que ejerce Camunda 8.
- Longevidad VS novedad: Uno de los puntos donde indiscutiblemente Camunda 8 supera a Temporal es en su comunidad, ya que este lleva en funcionamiento más tiempo, brindando así mejores integraciones con otros sistemas y herramientas, mejor soporte general y mayor información y documentación relativa a su uso.
Conclusión:
Se han podido comprobar de primera mano las cualidades que ofrece Temporal con su software además de su orquestación a nivel de código. Es una herramienta que unifica grandes necesidades en aplicaciones con flujos de trabajo complejos y en grandes cantidades, facilitando su correcta gestión de manera simple y muy intuitiva gracias a su Web UI.
Desde control de errores, pausas controladas, facilidad de distribución de trabajo, hasta procesamiento de datos y la observabilidad de métricas, Temporal se posiciona como un orquestador que facilita equipos con microservicios y lógica de negocio distribuida, convirtiendo el caos en código mantenible, resiliente y listo para escalar.
¿Quieres saber más sobre Hunters?
Ser un hunter es aceptar el reto de probar nuevas soluciones que aporten resultados diferenciales. Únete al programa Hunters y forma parte de un grupo transversal con capacidad de generar y transferir conocimiento.
Anticípate a las soluciones digitales que nos harán crecer. Consulta más información sobre Hunters en la web.

Francisco Fernández
Técnico de Software
Altia