Comparativa técnica entre Obelisk, Temporal y Restate en Rust

Fuentes: Comparing Obelisk with Temporal and Restate

Obelisk, Temporal y Restate son tres plataformas que permiten que una función continúe ejecutándose tras la desaparición de su proceso. La diferencia arquitectónica clave es que Obelisk actúa como un runtime de workflows que carga y ejecuta los componentes de la aplicación por sí mismo, mientras que Temporal y Restate son orquestadores cuyo código de aplicación corre en Workers o endpoints de servicio desplegados por separado. Esa distinción determina qué errores puede prevenir cada sistema y qué artefactos se despliegan finalmente.

El autor implementó el mismo workflow en los tres entornos para comparar sus API en Rust, los límites de determinismo, el aislamiento de actividades, la gestión de secretos y los modelos de despliegue. El workflow obtiene en paralelo las temperaturas de Ámsterdam y París desde Open-Meteo, espera un segundo mediante un temporizador durable y devuelve la ciudad más cálida, lo que permite evaluar cuatro fronteras: efectos secundarios que no deben ejecutarse en código determinista, concurrencia, durabilidad del temporizador tras un reinicio y comparativa final determinista.

En Obelisk los componentes exponen interfaces tipadas definidas con WIT y el workflow importa funciones generadas para lanzar y.await_next sobre join sets. Temporal, cuyo SDK de Rust está en Public Preview, emplea macros para definir workflows y actividades tipadas y usa un macro workflow-aware join! para sondear futuros durables en orden determinista. Restate modela la operación HTTP como un servicio aparte invocado mediante un cliente generado y registra las llamadas completadas en un DurableFuturesUnordered para que el orden de recuperación no altere los resultados.

En cuanto a la cancelación, Obelisk aplica concurrencia estructurada y no permite que un padre termine mientras queden hijos pendientes. Temporal Rust no une futuros durables automáticamente y obliga a la aplicación a esperarlos o cancelarlos. Restate envía una llamada durable al crear el CallFuture, pero devolver sin esperar no la une ni la cancela; .send() explicita el trabajo unidireccional.

Sobre el determinismo, los tres sistemas recuperan el estado reejecutando el código contra un historial persistente. La diferencia es el grado de restricción en la primera ejecución: Obelisk compila el workflow a wasm32-unknown-unknown y le impide abrir sockets, leer archivos, usar el reloj del host o generar aleatoriedad, eliminando de raíz clases de no-determinismo. Temporal y Restate se apoyan más en convenciones del desarrollador.