Skip to content
IRC-CodingIRC-Coding
IdempotenciaIdempotency KeyREST APIWebhooksAPI DesignMétodos HTTP

Idempotencia en API Design: Webhooks y Idempotency Keys

Aprende idempotencia en APIs: métodos HTTP idempotentes, Idempotency Keys y cómo diseñar webhooks confiables.

S

schutzgeist

6 min read
Idempotencia en API Design: Webhooks y Idempotency Keys

Idempotencia en el Diseño de APIs: Webhooks y Ejemplos Prácticos

La idempotencia garantiza que las llamadas repetidas a una API devuelvan el mismo resultado, algo crucial para pagos, pedidos y webhooks.

Descripción General

La idempotencia es una propiedad de las operaciones que pueden ejecutarse múltiples veces sin alterar el resultado. En el diseño de APIs, es fundamental para interfaces confiables y tolerantes a fallos. GET, PUT y DELETE son idempotentes, mientras que POST generalmente no lo es. Para operaciones no idempotentes como POST o llamadas externas como webhooks, se utilizan Idempotency Keys para evitar ejecuciones duplicadas. Los webhooks también deben diseñarse de manera idempotente, permitiendo que los receptores procesen el mismo evento varias veces sin duplicar datos. Una estrategia sólida de idempotencia reduce errores causados por problemas de red, reintentos y race conditions, mejorando significativamente la confiabilidad de las APIs.

Componentes Clave

Métodos HTTP Idempotentes

GET es idempotente porque no causa cambios de estado. PUT es idempotente porque reemplaza completamente un recurso, sin importar cuántas veces se ejecute. DELETE es idempotente porque después de la primera eliminación el recurso ya no existe y los intentos posteriores producen el mismo estado final. POST no es idempotente porque cada llamada puede crear un nuevo recurso.

Idempotency Keys

Una Idempotency Key es un valor único que el cliente envía con la solicitud. El servidor almacena la clave y el resultado de la primera solicitud. Cuando se recibe una llamada repetida con la misma clave, el servidor devuelve el resultado almacenado en lugar de ejecutar la operación nuevamente. Esto es especialmente importante para pagos, reservas y pedidos.

Garantía de Idempotencia en Pagos

En APIs de pago, un error de red puede causar que el cliente reintente la solicitud. Sin una Idempotency Key, el pago se ejecutaría potencialmente dos veces. Con la Idempotency Key, el servidor garantiza que el pago se procese una sola vez, incluso si el cliente realiza múltiples solicitudes.

Webhooks e Idempotencia

Los webhooks son eventos enviados por el servidor al cliente. Pueden llegar múltiples veces debido a timeouts o reintentos. El receptor debe procesar los webhooks de forma idempotente, identificando cada evento mediante un ID único y descartando o ignorando duplicados.

Estrategias de Reintento e Idempotencia

Los clientes solo deben reintentar operaciones idempotentes automáticamente. GET y PUT pueden reintentarse con seguridad ante errores de red. POST solo debe reintentarse si se usa una Idempotency Key. Sin ella, pueden ocurrir cargos duplicados no deseados.

Almacenamiento de Idempotency Keys

Las Idempotency Keys deben almacenarse en el servidor durante un período definido. El almacenamiento puede ser una base de datos, caché o servicio dedicado. Lo importante es que las claves se vinculen con el resultado de la operación y no puedan reutilizarse para solicitudes diferentes.

TTL y Retención

Las Idempotency Keys deben tener un tiempo de vida definido. Después de que expire el TTL, la clave puede eliminarse. El cliente debe conocer cuánto tiempo es válida una clave para evitar reutilizarla demasiado tarde. Los TTLs típicos oscilan entre minutos y días.

Evitar Race Conditions

Cuando dos solicitudes con la misma Idempotency Key llegan simultáneamente, el servidor debe garantizar que solo se ejecute una operación. Los mecanismos de bloqueo u operaciones atómicas de base de datos ayudan a evitar race conditions.

Manejo de Errores en Idempotency Keys

Si una Idempotency Key es inválida o ha expirado, la API debe devolver un mensaje de error claro. El cliente puede entonces decidir si ejecutar la operación con una nueva clave o reenviar la solicitud original.

Monitoreo y Logs

Las Idempotency Keys y las solicitudes repetidas deben registrarse. Esto facilita la depuración y permite identificar patrones como timeouts frecuentes o envíos duplicados. El monitoreo puede alertar sobre problemas con anticipación.

Ejemplo Práctico

Una tienda en línea ofrece una API para crear pedidos. El cliente quiere asegurar que un pedido no se cree accidentalmente dos veces.

Solicitud con Idempotency Key:

POST /api/v1/orders
Content-Type: application/json
Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7

{
  "customerId": 123,
  "items": [
    { "productId": 42, "quantity": 2 }
  ]
}

Primera ejecución:

HTTP/1.1 201 Created
Location: /api/v1/orders/98765

{
  "orderId": 98765,
  "status": "created",
  "total": 79.97
}

Solicitud repetida con la misma clave:

POST /api/v1/orders
Content-Type: application/json
Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7

{
  "customerId": 123,
  "items": [
    { "productId": 42, "quantity": 2 }
  ]
}

El servidor reconoce la clave y devuelve el mismo resultado:

HTTP/1.1 201 Created
Location: /api/v1/orders/98765

{
  "orderId": 98765,
  "status": "created",
  "total": 79.97
}

Webhook con Event-ID:

POST /webhooks/orders
Content-Type: application/json
X-Event-ID: event-12345-abcde

{
  "eventType": "order.created",
  "orderId": 98765,
  "status": "created"
}

El receptor almacena el X-Event-ID y procesa los IDs iguales solo una vez. De esta forma, el procesamiento permanece idempotente aunque el webhook se envíe múltiples veces.

Preguntas Frecuentes: Idempotencia en el Diseño de APIs

1. ¿Qué es Idempotencia?

Idempotencia significa que una operación puede ejecutarse múltiples veces sin cambiar el resultado. Esto es importante para APIs confiables y reintentos seguros.

2. ¿Qué métodos HTTP son idempotentes?

GET, PUT y DELETE son idempotentes. POST generalmente no lo es, porque cada llamada puede crear un nuevo recurso.

3. ¿Qué es una Idempotency Key?

Una Idempotency Key es un valor único que proporciona el cliente. El servidor la almacena junto con el resultado y devuelve el mismo resultado en caso de reintento, sin ejecutar la operación nuevamente.

4. ¿Por qué es importante la Idempotencia en pagos?

Los errores de red pueden provocar reintentos de pagos. Sin Idempotencia, el mismo pago podría ejecutarse múltiples veces. Las Idempotency Keys previenen cargos duplicados.

5. ¿Qué es un Webhook?

Un webhook es una solicitud HTTP iniciada por el servidor hacia el cliente para notificar sobre un evento. Se utilizan para confirmaciones de pago, cambios de estado o notificaciones.

6. ¿Por qué los Webhooks deben ser idempotentes?

Los webhooks pueden llegar múltiples veces por timeouts o reintentos. El procesamiento idempotente previene que los eventos se procesen dos veces.

7. ¿Cómo se identifican Webhooks duplicados?

Los webhooks duplicados se identifican mediante IDs de evento únicos. El receptor almacena estos IDs y procesa eventos con el mismo ID solo una vez.

8. ¿Qué sucede con solicitudes simultáneas usando la misma Idempotency Key?

El servidor debe garantizar que solo se ejecute una operación. Los bloqueos u operaciones atómicas de base de datos previenen race conditions en solicitudes simultáneas.

9. ¿Cuánto tiempo debe almacenarse una Idempotency Key?

El tiempo de almacenamiento depende del caso de uso. Los períodos típicos varían desde minutos hasta días. Lo importante es que el cliente conozca la validez de la clave y no la reutilice tarde.

10. ¿Puede PATCH ser idempotente?

PATCH es idempotente solo si la operación no cambia el resultado cuando se ejecuta múltiples veces. Depende de la implementación específica del documento de patch.

11. ¿Qué ocurre con una Idempotency Key inválida?

Ante una clave inválida o expirada, la API devuelve un error. El cliente puede entonces optar por ejecutar la operación con una nueva clave.

12. ¿Se deben usar Idempotency Keys en todas las solicitudes POST?

Las Idempotency Keys son especialmente importantes en solicitudes POST que inician transacciones comerciales como pagos, pedidos o reservas. Para consultas puras o solicitudes sin compromiso generalmente no son necesarias.

13. ¿Cuál es la diferencia entre Idempotencia y Safe Methods?

Safe Methods no alteran el estado del servidor, como GET y HEAD. Los métodos idempotentes pueden cambiar el estado pero devuelven el mismo resultado en repeticiones, como PUT y DELETE.

14. ¿Cómo se prueba la Idempotencia?

Se prueba la Idempotencia enviando la misma solicitud múltiples veces y comparando los resultados. Para solicitudes POST, verificas que los reenvíos con la misma Idempotency Key no generen nuevos recursos.

15. ¿Qué relación existe entre Idempotencia y Estrategias de Reintento?

Las estrategias de reintento deben reintentar automáticamente solo operaciones idempotentes. Las operaciones no idempotentes como POST sin Idempotency Key no deben reintentarse automáticamente, ya que podrían causar cargos duplicados.

Continuando en la ruta de aprendizaje de API

El siguiente artículo en la ruta de aprendizaje de API cubre Fundamentos de Webhooks — cómo funcionan los webhooks, cómo implementarlos de forma segura y qué aspectos debes tener en cuenta en la verificación de firmas.

Referencias

  1. https://www.rfc-editor.org/rfc/rfc9110
  2. https://stripe.com/docs/api/idempotent_requests
  3. https://datatracker.ietf.org/doc/html/draft-ietf-httpapi-idempotency-key

Lecturas recomendadas sobre desarrollo de APIs

Si deseas profundizar en idempotencia, diseño de APIs y arquitectura de software, te recomendamos los siguientes libros:

Keine Bücher für Kategorie "api-development" gefunden.

Volver al blog
Share:

Nächster Artikel in Desarrollo de APIs

Weiterlesen
JWT Token: estructura, seguridad y uso en APIs

Entradas relacionadas