Idempotencia
Te explicamos sobre nuestro esquema de idempotencia para evitar crear dos o más recursos para la misma solicitud.
___
Como una solicitud HTTP puede dar timeout, tenemos que asegurarnos de que al reintentar se procese una única vez. Para eso, en cada solicitud, te enviaremos un header x-idempotency-key con ID único que deberás procesar con un caché en memoria (por ejemplo: redis).
Al comienzo de cada transacción, deberás verificar si la clave de idempotencia que te enviamos ya está en la caché en memoria y dependiendo de si está o no, deberás realizar lo siguiente:
No existe el header de idempotencia en la caché
Deberás almacenar en la caché en memoria la relación clave de idempotencia → pedido con un estado en tránsito con un TTL de 3 minutos.
Cuando apruebes o rechaces la transacción, deberás almacenar el resultado en la caché y actualizar el estado de la clave de idempotencia a ‘terminado'.
Existe el header de idempotencia en la caché
En caso de una solicitud duplicada, deberás verificar el estado de la transacción en la caché.
- Si está en estado terminado deberás responder con un código HTTP 200 con el body esperado para el endpoint y completarlo con el resultado de la caché.
- Si está en estado en tránsito deberás responder con un código HTTP 425 (Too Early: RFC 8470) con el body esperado para el endpoint. Nosotros volveremos a buscar la respuesta de esta solicitud unos milisegundos más tarde.
Requests en curso
Si recibes un segundo request con el mismo ID de idempotencia y el primero aún está en curso, debes responder con un http-status 425 y body vacío.