π Caso 09 β Python 3.12 con adapter y cache defensiva#
Implementacion operativa del caso 09 para contrastar una integracion externa directa contra una variante endurecida.
β¬ οΈ Caso 09 Β· βοΈ Comparativa de los 7 stacks Β· π Perfil de Python Β· 𧬠Todos los perfiles
π― Que resuelve#
Modela un consumo de catalogo externo donde el proveedor puede:
- cambiar esquema sin aviso;
- responder con payload parcial o malformado;
- reenviar eventos duplicados;
- fallar en un subconjunto de items del batch.
La variante catalog-hardened agrega sanitizacion de SKU, validacion de esquema, idempotencia por event_id y procesamiento parcial tolerante a fallos.
πΌ Por que importa#
Este caso deja visible que la resiliencia frente a terceros no depende solo del timeout. TambiΓ©n importa la estabilidad del contrato, la validez de los identificadores y la capacidad de operar con informacion parcialmente valida sin contaminar el catalogo interno.
π¬ Analisis Tecnico de la Implementacion (Python)#
Las APIs de terceros fallan en formas sutiles. Este caso implementa integracion defensiva usando expresiones regulares, operadores de fusion y gestion de idempotencia en memoria.
- Llamado Vulnerable (
legacy): La funcionrun_legacy_sync()acepta la respuesta del proveedor sin ninguna validacion. Si el proveedor envia un SKU con caracteres invalidos (SKU 100con espacio, oX), el codigo lo acepta y lo inserta directamente en el catalogo interno. Si el proveedor omite un campo esperado (ej.priceausente), el accesoitem["price"]lanza unKeyErrorque derrumba el batch completo. Si el mismo evento llega dos veces, se procesa dos veces sin deteccion de duplicado. El resultado es un catalogo potencialmente corrupto y un comportamiento no deterministico bajo condiciones de red reales. - Aislado Robusto (
hardened): Introduce tres capas defensivas. Primero,sanitize_sku(sku)valida el SKU conre.match(r"^[A-Z0-9-]{4,20}$", sku)y retorna un default determinista si no pasa. Segundo,validate_schema(item)verifica la presencia de campos requeridos antes de procesar, descartando items invalidos en lugar de fallar el batch completo. Tercero, la idempotencia se gestiona con unsetdeprocessed_event_ids:if event_id in processed_event_ids: continue. Esto garantiza que eventos duplicados del proveedor sean silenciosamente ignorados sin afectartotal_processed. El procesamiento parcial permite que items validos del batch sean aceptados aunque otros sean invalidos.
π§± Servicio#
appβ API Python 3.12 con proveedor externo simulado, adapter de contrato, cache de idempotencia y metricas de calidad de datos.
π Arranque#
docker compose -f compose.yml up -d --buildPuerto local: 839 (modo aislado, ver opciones abajo).
Como consumir (dos opciones)#
Hub Python (recomendado, 8200 en compose.python.yml): este caso queda servido en http://localhost:8200/09/... junto a los otros 11 casos.
Modo aislado (839 en este compose.yml): levanta solo este caso, util cuando la medicion necesita procesar limpio (sin otros casos compartiendo runtime).
π Endpoints#
curl http://localhost:8200/09/
curl http://localhost:8200/09/health
curl "http://localhost:8200/09/catalog-legacy?scenario=malformed_sku&batch_size=10"
curl "http://localhost:8200/09/catalog-hardened?scenario=malformed_sku&batch_size=10"
curl http://localhost:8200/09/integration/state
curl "http://localhost:8200/09/sync-events?limit=10"
curl http://localhost:8200/09/diagnostics/summary
curl http://localhost:8200/09/metrics
curl http://localhost:8200/09/metrics-prometheus
curl http://localhost:8200/09/reset-labπ§ͺ Escenarios utiles#
schema_driftβ muestra normalizacion de contrato versus ruptura directa porKeyError.malformed_skuβ legacy acepta SKUs invalidos; hardened sanitiza o rechaza.duplicate_eventsβ legacy procesa dos veces; hardened detecta porevent_id.partial_failureβ legacy falla todo el batch; hardened procesa los items validos.
π§ Que observar#
- cuantos
corrupted_itemsacumula legacy vs cuantosrejected_itemsregistra hardened; - si
idempotent_skipssube en hardened con el escenarioduplicate_events; - como cambia
data_quality_scoreentre modos en/diagnostics/summary; - si el batch completo falla en legacy ante un solo item invalido.
βοΈ Nota de honestidad#
No reemplaza una integracion real con colas, DLQ ni proveedores de terceros. Si reproduce las decisiones operativas que importan aqui: adapter, contrato defensivo, idempotencia y tolerancia a fallos parciales.