Desarrollador Full-stack: pregunta de entrevista
¿Cómo gestionas transacciones entre servicios?
No extiendas una transacción de base de datos entre servicios; mantén cada transacción local atómica y coordina el flujo con comandos idempotentes, eventos duraderos, reintentos, compensación y una máquina de estados observable.
Respuesta directa
Qué debe cubrir una buena respuesta
Cómo funciona
No existe un commit que abarque dos bases de datos de servicios distintos sin un coordinador que se convierte en cuello de botella y punto único de fallo. En su lugar el flujo se descompone: cada servicio realiza una transacción local atómica y publica un evento duradero o acepta un comando idempotente; una saga, orquestada por un coordinador o coreografiada mediante eventos, avanza paso a paso y ejecuta acciones compensatorias cuando falla un paso posterior. El estado del flujo se guarda explícitamente para que los operadores vean instancias atascadas, y cada paso tolera duplicados y reintentos.
Ejemplo
Hacer un pedido reserva inventario, cobra la tarjeta y crea un envío en tres servicios. El orquestador escribe el pedido en estado PENDING, envía ReserveStock y luego ChargeCard; si el cobro falla envía ReleaseStock como compensación y marca el pedido como FAILED. El patrón outbox garantiza que el evento de cada servicio se publica si y solo si su transacción local se confirmó.
Errores frecuentes
- Llamar a tres servicios en fila desde un handler y esperar que ninguno falle a medias.
- Diseñar compensaciones que asumen que la acción original ocurrió con seguridad.
- No dejar registro de las sagas en vuelo, de modo que un fallo deja pedidos en estado desconocido.
Una estructura útil para responder
Responde desde tu propia experiencia.
No memorices un guion: usa solo ejemplos que puedas explicar con honestidad en preguntas posteriores.
Abre el espacio de trabajo de escritorio y ensaya una respuesta clara con tus propias palabras.