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
Midaz usa claves de idempotencia para garantizar que las operaciones de transacción sean seguras de reintentar y nunca se procesen más de una vez. Este mecanismo está disponible en todos los endpoints de transacción:
/transactions/json, /transactions/dsl, /transactions/inflow, /transactions/outflow, /transactions/annotation y /transactions/{id}/revert.
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é.
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) conX-Idempotency-Replayed: false. - Si ya terminó, 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 ConflictconX-Idempotency-Replayed: false. - Si la operación está completa, 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:
- Control total sobre la deduplicación, incluso si el cuerpo de la solicitud cambia ligeramente entre reintentos.
- 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:
Idempotencia entre productos de Lerian
Varios productos de Lerian admiten idempotencia, cada uno con su propia convención de encabezado. La mayoría de los productos devuelven el encabezado de respuesta
X-Idempotency-Replayed para indicar si la respuesta repite un resultado en caché. Midaz siempre incluye este encabezado (false para solicitudes nuevas, true para repeticiones), mientras que otros servicios solo lo agregan cuando la respuesta es una repetición. La ausencia del encabezado significa una solicitud nueva. Direct Pix no devuelve este encabezado.
X-Idempotency-Replayed en la respuesta (false para solicitudes nuevas, true para repeticiones). Otros servicios (Matcher, TED, Indirect Pix y Reporter) solo agregan este encabezado cuando la respuesta es una repetición. La ausencia del encabezado significa una solicitud nueva. Direct Pix no devuelve este encabezado. Su middleware de idempotencia repite la respuesta completa de forma transparente, sin indicador de repetición.requestId. POST /v1/validations deduplica según el campo del cuerpo y devuelve el resultado en caché con HTTP 200 (HTTP 201 en la primera llamada). Las operaciones de token de Auth son inherentemente idempotentes. Las entidades de CRM y de onboarding dependen de restricciones de unicidad en su lugar.Preguntas frecuentes
¿Qué ocurre si no envío una clave de idempotencia?
¿Qué ocurre si no envío una clave de idempotencia?
¿Puedo reutilizar una clave en diferentes organizaciones o ledgers?
¿Puedo reutilizar una clave en diferentes organizaciones o ledgers?
¿Puedo reutilizar una clave en diferentes endpoints?
¿Puedo reutilizar una clave en diferentes endpoints?
¿Qué ocurre si cambio el TTL en un reintento?
¿Qué ocurre si cambio el TTL en un reintento?
¿La respuesta repetida siempre será idéntica?
¿La respuesta repetida siempre será idéntica?
201 Created), los encabezados 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?
¿Qué ocurre si la solicitud original falla?
¿Qué ocurre si la solicitud original falla?

