¿Qué hace patrones-de-orquestacion-de-flujos-de-trabajo?
Diseña flujos de trabajo duraderos con Temporal para sistemas distribuidos. Cubre la separación entre flujos de trabajo y actividades, patrones saga, gestión de estado y restricciones de determinismo. Útil al construir procesos de larga ejecución, transacciones distribuidas u orquestación de microservicios.
Separación de Workflows y Activities
- Workflows: Definen la lógica de orquestación (secuencia, compensaciones, temporizadores). Son deterministas y deben registrar cada paso.
- Activities: Contienen la lógica de integración real (llamadas HTTP, consultas a BD, envío de correos). Pueden ser no deterministas y se ejecutan en workers separados.
Patrón Saga
El patrón saga gestiona transacciones distribuidas mediante eventos compensatorios. Temporal lo implementa de forma natural con el manejo de errores y actividades de compensación:
const orderWorkflow = async () => {
try {
await reserveInventory(itemId);
await processPayment(orderId, amount);
await confirmOrder(orderId);
} catch (err) {
await cancelOrder(orderId);
await refundPayment(orderId);
}
};
Gestión de Estado
- Variables de workflow: Almacenan el estado actual del flujo (ej.
orderStatus,retryCount). - Señales: Comunicación asíncrona hacia el workflow (ej.
updateStatus,cancelWorkflow). - Consultas: Lectura del estado del workflow sin mutarlo.
- Mementos: Almacenamiento externo para estados complejos (ej. base de datos).
Restricciones de Determinismo
- Evitar race conditions: No usar variables globales o fechas/hora locales dentro del workflow (usar
workflow.now()). - No bloqueo: No usar
setTimeouto promesas no confiables dentro del workflow; usarworkflow.sleep()oworkflow.timer(). - Idempotencia: Las actividades deben ser idempotentes para manejo de reintentos.
- Replay seguro: El código del workflow debe producir el mismo resultado al ser rehecho a partir del historial.
Ejemplo de Flujo de Trabajo
# .temporal.yaml
namespace: my-namespace
task-queue: my-task-queue
import { proxyActivities } from '@temporalio/workflow';
const { createOrder, sendConfirmation } = proxyActivities({
startToCloseTimeout: '30 seconds',
});
export async function orderProcessingWorkflow(orderId: string): Promise<void> {
const order = await createOrder(orderId);
await sendConfirmation(order.email);
}