Cómo hacer seguros los reintentos
Las solicitudes fallidas a la API son comunes. Ocurre un tiempo de espera de red, o tu servicio se cae justo después de enviar una solicitud. Reintentar es natural, y necesitas estar seguro de que Midaz no procesará la misma operación dos veces. Al adjuntar una clave única a cada solicitud, le dices a Midaz: “Esta es la misma operación. Si ya la procesaste, no la vuelvas a procesar.” Midaz almacena esta clave temporalmente y la usa para determinar si la solicitud es nueva, está completa o aún está en curso. Esto protege tu sistema contra duplicados.Idempotencia en Midaz
El encabezado
X-Idempotency está disponible en todos los endpoints de creación de transacciones: en /v1, json, inflow, outflow, annotation, block y unblock; en /v2, direct, hold, block, unblock y batch. La reversión no recibe clave propia: Midaz deriva una.
Las demás APIs de Lerian usan sus propios encabezados de idempotencia, o ninguno. Esta página se centra en la idempotencia de la API del Ledger de Midaz.
Los endpoints de transacción
commit y cancel usan un bloqueo basado en Redis para evitar el procesamiento concurrente de la misma transacción, pero no admiten idempotencia completa (sin respuestas en caché ni encabezado X-Idempotency-Replayed).X-Idempotency: la clave única que identifica la solicitud.X-TTL: el tiempo de vida (en segundos) que Midaz debe almacenar esta clave en caché.
Si no envías el encabezado
X-Idempotency, Midaz genera uno automáticamente calculando un hash SHA-256 del cuerpo de la solicitud. Por lo tanto, Midaz deduplica cuerpos de solicitud idénticos enviados a la misma organización y ledger.- Cuando llega una clave nueva, Midaz la marca como
pending, procesa la solicitud y almacena la respuesta completa en caché. - Si envías la misma clave otra vez dentro de la ventana del TTL:
- Mientras la operación se ejecuta, Midaz devuelve un
409 Conflict(código de error0084). - Si ya terminó y la solicitud coincide, Midaz devuelve exactamente la misma respuesta con un código de estado
201 CreatedyX-Idempotency-Replayed: true.
- Mientras la operación se ejecuta, Midaz devuelve un
- Si la transacción falla por errores de validación o saldo insuficiente, Midaz elimina la clave de idempotencia. Luego puedes corregir el problema y reintentar con la misma clave.
Resumen del flujo
La Figura 1 muestra el ciclo de vida completo de una solicitud idempotente:Figura 1. Ciclo de vida de una solicitud idempotente en Midaz.
- Si la solicitud no incluye una clave de idempotencia existente, Midaz crea una nueva, o la genera automáticamente a partir del hash del cuerpo de la solicitud. Luego Midaz procesa la solicitud, almacena la respuesta y la devuelve con
X-Idempotency-Replayed: false. - Si la clave ya existe:
- Mientras la operación se ejecuta, Midaz devuelve un
409 Conflict. - Si la operación está completa y la solicitud coincide, Midaz omite la ejecución y devuelve la respuesta en caché con un código de estado
201 CreatedyX-Idempotency-Replayed: true.
- Mientras la operación se ejecuta, Midaz devuelve un
- Si la solicitud original falló por errores de validación o de saldo, Midaz elimina la clave automáticamente. Puedes reintentar de forma segura con la misma clave.
Solicitud de ejemplo
Así se envía una solicitud idempotente para crear una transacción:Generación de claves
Puedes proporcionar tu propia clave
X-Idempotency o dejar que Midaz genere una automáticamente.
Generación automática de claves
Si omites el encabezadoX-Idempotency, Midaz calcula un hash SHA-256 del cuerpo de la solicitud y lo usa como clave de idempotencia. Por lo tanto, Midaz deduplica el mismo cuerpo JSON exacto enviado a la misma organización y ledger.
Esto es suficiente para la mayoría de los escenarios de reintento en los que el cuerpo de la solicitud no cambia entre intentos.
Generación de claves personalizadas
Usa una clave personalizada cuando necesites:- Correlacionar la clave de idempotencia con un ID de tu propio sistema (por ejemplo, un ID de pedido).
- Reintentar con un cuerpo de solicitud modificado mientras sigues deduplicando (por ejemplo, después de corregir un campo).
- Controlar el formato de la clave para fines de registro o auditoría.
Mejores prácticas
Siempre valida el encabezado X-Idempotency-Replayed
Cuando tu sistema recibe una respuesta de un endpoint de transacción, siempre verifica el encabezado de respuesta X-Idempotency-Replayed antes de procesar el resultado. Este encabezado te indica si la respuesta proviene de una operación nueva o de una repetición en caché:
X-Idempotency-Replayed: false: esta es una respuesta nueva. Midaz acaba de procesar la transacción.X-Idempotency-Replayed: true: esta respuesta proviene de la caché. Midaz ya procesó la transacción.
X-Idempotency-Replayed para evitar liquidar el mismo boleto dos veces.
Usa claves de idempotencia explícitas para flujos críticos
Aunque Midaz genera claves automáticamente a partir del cuerpo de la solicitud, para flujos financieros críticos (liquidaciones, pagos, transferencias), proporciona siempre una claveX-Idempotency explícita vinculada al ID de tu proceso de negocio. Esto te da:
- Después de que la primera solicitud tiene éxito, un reintento con el cuerpo modificado dentro de la ventana del TTL recibe
409(0084) en lugar de una segunda transacción. - Un registro de auditoría claro que vincula las transacciones de Midaz con tus operaciones internas.
- Protección contra casos límite en los que la serialización de la solicitud podría diferir.
Establece valores de TTL adecuados
Elige valores de TTL que coincidan con tu ventana de reintento:- Para operaciones síncronas con reintentos rápidos: 60–120 segundos.
- Para workflows asíncronos con posibles retrasos: 300–600 segundos.
- Para procesamiento por lotes con ventanas de reintento largas: considera TTL más largos y claves explícitas.
Estrategia de reintentos
Usa estos patrones para diferentes escenarios de falla:
Fallas reintentables
Estas fallas son seguras de reintentar con la misma clave de idempotencia:Fallas no reintentables
Estas fallas requieren un enfoque diferente:Backoff exponencial
Para errores transitorios, usa backoff exponencial con jitter para evitar sobrecargar el servidor:Prevención de duplicación de entidades
Para algunos endpoints, no necesitas claves de idempotencia para evitar duplicados. Midaz aplica restricciones de unicidad en recursos críticos. Si intentas crear una entidad que entra en conflicto con una existente, el sistema bloquea la solicitud y devuelve un
409 Conflict con un error descriptivo:
A diferencia de las claves de idempotencia, estas restricciones son permanentes y no expiran.
Idempotencia entre productos de Lerian
Las demás APIs de Lerian definen sus propios encabezados, alcances y señales de repetición de idempotencia, y algunas no admiten ningún encabezado de idempotencia. Consulta la referencia de la API del producto que llamas antes de reintentar un comando.
Preguntas frecuentes
¿Qué ocurre si no envío una clave de idempotencia?
¿Qué ocurre si no envío una clave de idempotencia?
Midaz genera una automáticamente calculando un hash SHA-256 del cuerpo de la solicitud. Por lo tanto, Midaz deduplica cuerpos de solicitud idénticos enviados a la misma organización y ledger. Solo necesitas proporcionar una clave personalizada si quieres controlar la deduplicación de forma independiente del cuerpo de la solicitud.
¿Puedo reutilizar una clave en diferentes organizaciones o ledgers?
¿Puedo reutilizar una clave en diferentes organizaciones o ledgers?
Sí. Midaz limita el alcance de las claves de idempotencia por organización y ledger. El mismo valor de clave usado en distintas organizaciones o ledgers no genera conflicto. Sin embargo, dentro de la misma organización y ledger, cada clave debe ser única por operación.
¿Puedo reutilizar una clave en diferentes endpoints?
¿Puedo reutilizar una clave en diferentes endpoints?
No. Usa una clave única para cada operación distinta.
¿Qué ocurre si cambio el TTL en un reintento?
¿Qué ocurre si cambio el TTL en un reintento?
Midaz solo usa el TTL de la primera solicitud. Cambiarlo después no tiene efecto.
¿La respuesta repetida siempre será idéntica?
¿La respuesta repetida siempre será idéntica?
Sí. Midaz repite la respuesta completa, incluidos el código de estado (
201 Created) y el cuerpo, para las solicitudes completadas.¿Cuál es el TTL predeterminado si no envío X-TTL?
¿Cuál es el TTL predeterminado si no envío X-TTL?
La ventana predeterminada es de 300 segundos (5 minutos).
¿Qué ocurre si la solicitud original falla?
¿Qué ocurre si la solicitud original falla?
Si la transacción falla por errores de validación o saldo insuficiente, Midaz elimina la clave de idempotencia de la caché. Esto te permite corregir el problema y reintentar con la misma clave.

