Saltar al contenido principal

¿Qué es la Idempotencia?

En el contexto de webhooks, la idempotencia es la propiedad de un endpoint que asegura que procese eventos duplicados exactamente una vez. La mayoría de los emisores de webhooks, incluido Trophy, operan con una garantía de entrega “al menos una vez”. Esto significa que eventualmente puedes recibir el mismo webhook varias veces y tu código necesita manejar esos escenarios sin consecuencias no deseadas. Por ejemplo, si tu manejador de webhooks está suscrito a eventos leaderboard.finished y envía tarjetas de regalo a los usuarios que quedan en el top 10, entonces tu código necesita enviar las tarjetas de regalo solo una vez incluso si recibe el mismo evento de Trophy varias veces.

Implementar la Idempotencia de Webhooks

Hacer que tus manejadores de webhooks sean más robustos es trivial en la mayoría de los casos. Tomemos el ejemplo de la tarjeta de regalo anterior. Después de enviar una tarjeta de regalo a un usuario, tu código podría insertar un registro en tu base de datos que represente que la tarjeta de regalo ha sido enviada al usuario.
-- Create a table to store gift card receipts
CREATE TABLE gift_card_receipts (
    id text PRIMARY KEY,
    user_id text NOT NULL,
    gift_card_id text NOT NULL
)

-- Insert a row after sending gift card
INSERT INTO gift_card_receipts (id, user_id, gift_card_id)
VALUES ('webhook_event_id', 'user_123', 'gift_card_abc')

-- Check before sending gift card
SELECT * FROM gift_card_receipts
WHERE user_id = 'user-id'
AND gift_card_id = 'gift-card-id'
LIMIT 1
Luego, antes de enviar tarjetas de regalo, agrega una declaración if que verifique si la tarjeta de regalo ya ha sido enviada al usuario.
var receipt = await getGiftcardReceipt();

if (!receipt) {
  sendGiftCard();
} else {
  // Duplicate event - do nothing
}
Si tu código recibe un evento duplicado, la tarjeta de regalo no se enviará nuevamente.

Obtener Soporte

¿Quieres ponerte en contacto con el equipo de Trophy? Contáctanos por correo electrónico. ¡Estamos aquí para ayudarte!