Propuesta de arquitectura: reservas idempotentes y un outbox local
Una propuesta verificable con Python y SQLite: conserva una sola reserva, rechaza claves conflictivas y revierte una escritura incompleta.
Luis Tavarez ·
Contexto y criterio de aceptación
Un cliente puede repetir una solicitud tras perder la respuesta. Queremos conservar una reserva por clave, devolver el resultado de una repetición equivalente y rechazar una clave usada con otro importe. Se propone persistir la reserva y el evento pendiente en una misma transacción local.
Decisión propuesta
reservations tiene una clave primaria request_key. Un insert con conflicto no crea otra reserva; después se lee el importe guardado y se compara con el solicitado. outbox usa la misma clave para registrar un único evento de creación. Un constraint, no un diccionario en memoria, sostiene la deduplicación.
Por qué probar también el fallo
El ejemplo repite una petición, rechaza un importe distinto e inyecta un error al insertar en outbox. Comprueba que la reserva de esa operación fallida no queda guardada. Después reabre el archivo para verificar que la deduplicación sobrevivió al cierre de la conexión.
Alternativas y consecuencias
Un caché de claves en el proceso pierde su estado al reiniciar. Separar ambas escrituras deja una ventana de inconsistencia. Una transacción local limita esa ventana dentro de SQLite, pero no entrega el evento a un broker. El consumidor externo, sus reintentos y su deduplicación son trabajo posterior.
Estado de la propuesta
Es un prototipo local y secuencial. No reserva fondos reales, no implementa autenticación, no demuestra rendimiento concurrente y no sustituye una evaluación operativa. Antes de adoptarlo define alcance y expiración de las claves, política de respuesta, carga esperada, copias de seguridad, recuperación y pruebas de concurrencia. El siguiente paso es validar estos criterios con el equipo, no multiplicar servicios sin una necesidad medida.