Hacer que los reintentos sean seguros
En sistemas del mundo real, las solicitudes de API fallidas son comunes. Tal vez ocurra un tiempo de espera de red. Tal vez su servicio se caiga justo después de enviar una solicitud. En estos casos, es natural reintentar, pero ¿cómo puede estar seguro de que Midaz no procesará la misma operación dos veces? Ahí es donde entran las claves de idempotencia. Al adjuntar una clave única a cada solicitud, le está diciendo a Midaz: “Esta es la misma operación. Si ya la has procesado, no la hagas de nuevo.” Midaz almacena esta clave temporalmente y la usa para determinar si la solicitud es nueva, ya completada o todavía en proceso. Esto protege su sistema de duplicados mientras le da control total sobre su estrategia de reintentos.Idempotencia en Midaz
Midaz usa claves de idempotencia para asegurar 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 transacciones:
/transactions/json, /transactions/dsl, /transactions/inflow, /transactions/outflow, /transactions/annotation y /transactions/{id}/revert.
Otros productos de Lerian también soportan idempotencia a través de sus propios encabezados — consulte la sección Idempotencia en los productos Lerian a continuación. Esta página se enfoca en la idempotencia para la API del Midaz Ledger.
Los endpoints
commit y cancel de transacciones usan un bloqueo basado en Redis para prevenir el procesamiento concurrente de la misma transacción, pero no soportan 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ía el encabezado
X-Idempotency, Midaz genera uno automáticamente calculando un hash SHA-256 del cuerpo de la solicitud. Esto significa que cuerpos de solicitud idénticos enviados a la misma organización y ledger se deduplicarán automáticamente.- Cuando llega una nueva clave, Midaz la marca como
pending, procesa la solicitud y almacena la respuesta completa en caché. - Si la misma clave se usa nuevamente dentro de la ventana TTL:
- Si la operación todavía se está ejecutando, Midaz devuelve un
409 Conflict(código de error0084) conX-Idempotency-Replayed: false. - Si está terminada, Midaz devuelve exactamente la misma respuesta con un código de estado
201 CreatedyX-Idempotency-Replayed: true.
- Si la operación todavía se está ejecutando, Midaz devuelve un
- Si la transacción falla por errores de validación o saldo insuficiente, Midaz elimina la clave de idempotencia, permitiéndole reintentar con la misma clave después de corregir el problema.
Resumen del flujo de trabajo
La Figura 1 muestra el ciclo de vida completo de una solicitud idempotente:
- Si la solicitud no incluye una clave de idempotencia existente, Midaz crea una nueva (o genera una automáticamente a partir del hash del cuerpo de la solicitud), procesa la solicitud, almacena la respuesta y la devuelve con
X-Idempotency-Replayed: false. - Si la clave ya existe:
- Si la operación todavía se está ejecutando, 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.
- Si la operación todavía se está ejecutando, Midaz devuelve un
- Si la solicitud original falló por errores de validación o saldo, la clave se limpia automáticamente, para que pueda reintentar con la misma clave de forma segura.
Ejemplo de solicitud
Aquí se muestra cómo enviar una solicitud idempotente para crear una transacción:Generación de claves
Puede proporcionar su propia clave
X-Idempotency o dejar que Midaz genere una automáticamente.
Generación automática de claves
Si omite el encabezadoX-Idempotency, Midaz calcula un hash SHA-256 del cuerpo de la solicitud y lo usa como clave de idempotencia. Esto significa que enviar el mismo cuerpo JSON exacto a la misma organización y ledger se deduplicará automáticamente, sin trabajo adicional.
Esto es suficiente para la mayoría de escenarios de reintento donde el cuerpo de la solicitud no cambia entre intentos.
Generación personalizada de claves
Use una clave personalizada cuando necesite:- Correlacionar la clave de idempotencia con un ID en su propio sistema (por ejemplo, un ID de pedido).
- Reintentar con la misma clave después de corregir un payload que falló validación o saldo, ya que Midaz elimina la clave en esos casos.
- Mantener la misma clave cuando el payload sea semánticamente el mismo, aunque su serialización cambie entre intentos.
Mejores prácticas
Siempre valide el header X-Idempotency-Replayed
Cuando su sistema recibe una respuesta de un endpoint de transacción, siempre verifique el header de respuesta X-Idempotency-Replayed antes de procesar el resultado. Este header le indica si la respuesta es de una operación nueva o una reproducción en caché:
X-Idempotency-Replayed: false— Esta es una respuesta nueva. La transacción acaba de procesarse.X-Idempotency-Replayed: true— Esta es una respuesta en caché. La transacción ya fue procesada anteriormente.
X-Idempotency-Replayed para evitar liquidar el mismo boleto dos veces.
Use claves de idempotencia explícitas para flujos críticos
Si bien Midaz genera claves automáticamente a partir del cuerpo de la solicitud, para flujos financieros críticos (liquidaciones, pagos, transferencias), siempre proporcione una claveX-Idempotency explícita vinculada al ID de su proceso de negocio. Esto le brinda:
- Control total sobre la deduplicación, incluso si el cuerpo de la solicitud cambia ligeramente entre reintentos.
- Un rastro de auditoría claro que vincula las transacciones de Midaz con sus operaciones internas.
- Protección contra casos extremos donde la serialización de la solicitud podría diferir.
Establezca valores TTL apropiados
Elija valores TTL que coincidan con su ventana de reintentos:- Para operaciones sincrónicas con reintentos rápidos: 60–120 segundos.
- Para flujos de trabajo asíncronos con posibles retrasos: 300–600 segundos.
- Para procesamiento por lotes con ventanas de reintento largas: considere TTLs más largos y claves explícitas.
Estrategia de reintentos
Cuando una solicitud falla, cómo reintenta es importante. Aquí están los patrones recomendados para manejar diferentes escenarios de fallo:
Fallos reintentables
Estos fallos son seguros de reintentar con la misma clave de idempotencia:| Escenario | Qué hacer |
|---|---|
| Timeout de red o error de conexión | Reintente con la misma clave y cuerpo. Si la solicitud original fue procesada, obtendrá la respuesta en caché. |
Error 5xx del servidor | Reintente con retroceso exponencial. El servidor puede estar temporalmente sobrecargado. |
409 Conflict con X-Idempotency-Replayed: false | La solicitud anterior todavía se está procesando. Espere y reintente después de una breve pausa. |
| Error de validación o saldo | Corrija el problema en su solicitud, luego reintente con la misma clave de idempotencia (Midaz elimina la clave en estos fallos). |
Fallos no reintentables
Estos fallos requieren un enfoque diferente:| Escenario | Qué hacer |
|---|---|
400 Bad Request (error de esquema) | Corrija el formato de la solicitud. No reintente el mismo payload. |
401 Unauthorized / 403 Forbidden | Verifique sus credenciales de autenticación. Reintentar no ayudará. |
404 Not Found | Verifique los IDs de organización, ledger o cuenta en la ruta de su solicitud. |
Retroceso exponencial
Para errores transitorios, use retroceso exponencial con jitter para evitar sobrecargar el servidor:Prevención de duplicación de entidades
Para algunos endpoints, no necesita claves de idempotencia para evitar la duplicación. Midaz aplica restricciones de unicidad en recursos críticos. Si intenta crear una entidad que entra en conflicto con una existente, el sistema bloquea la solicitud y devuelve un
409 Conflict con un error descriptivo:
| Recurso | Campo único | Código de error |
|---|---|---|
| Ledger | Nombre (dentro de la organización) | 0002 |
| Asset | Nombre o código (dentro del ledger) | 0003 |
| Segment | Nombre (dentro del ledger) | 0015 |
| Account | Alias (dentro de la organización y ledger) | 0020 |
| Account Type | Valor de clave (dentro de la organización y ledger) | 0108 |
Idempotencia en los productos Lerian
Múltiples productos de Lerian soportan idempotencia, cada uno con su propia convención de headers. La mayoría de los productos retornan el header de respuesta
X-Idempotency-Replayed para indicar si la respuesta es un replay del caché. Midaz siempre incluye este header (false para solicitudes nuevas, true para replays), mientras que los demás servicios solo lo agregan cuando la respuesta es un replay — si el header está ausente, la solicitud fue procesada como nueva. PIX Direct no retorna este header.
| Producto | Encabezado de solicitud | Acepta X-TTL | X-Idempotency-Replayed | Alcance | Endpoints cubiertos |
|---|---|---|---|---|---|
| Midaz | X-Idempotency | Sí (predeterminado 300s) | Siempre (false/true) | Por organización y ledger | Creación, anotación y reversión de transacciones (6 endpoints) |
| Matcher | X-Idempotency-Key (también acepta Idempotency-Key) | No | Solo en replay | Por tenant, método y ruta | Todos los endpoints POST/PUT/PATCH (~33 endpoints vía middleware global) |
| TED | X-Idempotency-Key | No | Solo en replay | Por clave de idempotencia (sin scoping por tenant) | Envío, devolución y cancelación de mensajes (3 endpoints) |
| PIX Indirect | X-Idempotency | Sí | Solo en replay | Por cuenta | Inicio de cashout, proceso de cashout y reembolso (3 endpoints) |
| PIX Direct | Idempotency-Key | No | No | Por clave | Creación de pago e inicio de devolución (2 endpoints) |
| Reporter | X-Idempotency | No | Solo en replay | Por clave | Creación de reportes y plantillas (2 endpoints) |
Midaz siempre incluye el header
X-Idempotency-Replayed en la respuesta (false para solicitudes nuevas, true para replays). Los demás servicios (Matcher, TED, PIX Indirect y Reporter) solo agregan este header cuando la respuesta es un replay — si el header está ausente, la solicitud fue procesada como nueva. PIX Direct no retorna este header; su middleware de idempotencia hace replay de la respuesta completa de forma transparente sin un indicador de replay.Fees Engine, Tracer, Auth y CRM actualmente no soportan encabezados de idempotencia. Las validaciones de Tracer son stateless y naturalmente seguras para reintentar. Las operaciones de tokens de Auth son inherentemente idempotentes. CRM y las entidades de onboarding dependen de restricciones de unicidad en su lugar.
Preguntas frecuentes
¿Qué sucede si no envío una clave de idempotencia?
¿Qué sucede si no envío una clave de idempotencia?
Midaz genera una automáticamente calculando un hash SHA-256 del cuerpo de la solicitud. Esto significa que cuerpos de solicitud idénticos enviados a la misma organización y ledger se deduplicarán automáticamente. Solo necesita proporcionar una clave personalizada si desea controlar la deduplicación independientemente del cuerpo de la solicitud.
¿Puedo reutilizar una clave en diferentes organizaciones o ledgers?
¿Puedo reutilizar una clave en diferentes organizaciones o ledgers?
Sí. Las claves de idempotencia están delimitadas por organización y ledger, por lo que el mismo valor de clave usado en diferentes organizaciones o ledgers no entrará en 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?
En Midaz, las claves de idempotencia están delimitadas por organización y ledger, no por endpoint. Si reutiliza la misma clave en un endpoint diferente dentro de la misma organización y ledger, recibirá la respuesta en caché del endpoint original. Siempre use claves únicas para cada operación distinta.
¿Qué sucede si cambio el TTL en un reintento?
¿Qué sucede si cambio el TTL en un reintento?
Solo se usa el TTL de la primera solicitud. Cambiarlo más tarde no tiene efecto.
¿La respuesta reproducida siempre será idéntica?
¿La respuesta reproducida siempre será idéntica?
Sí. Midaz reproduce la respuesta completa, incluyendo código de estado (
201 Created), encabezados y cuerpo, para 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é sucede si la solicitud original falla?
¿Qué sucede si la solicitud original falla?
Si la transacción falla por errores de validación o saldo insuficiente, Midaz elimina la clave de idempotencia del caché. Esto le permite corregir el problema y reintentar con la misma clave.

