MenuSync — Diseño de Arquitectura Azure

Arquitecto de Soluciones Cloud · Azure Architecture Center · Well-Architected Framework

v1.0Revisión
Junio 2026Fecha
4 ADRsDecisiones
99.9%SLO Objetivo
Requisitos Clave

Disponibilidad

99.9%

<8,7h downtime/año · RTO 1h · RPO 15min

Rendimiento

p95 <300ms

2.000 req/s pico · 5× crecimiento en 18 meses

Escala del equipo

4 devs

Full-stack · Sin especialista infra · Migración gradual

Presupuesto

≤4.000€/mes

Fase inicial · Región Europa · GDPR compliant

Arquitectura Target — Estilo Web-Queue-Worker + Event-Driven
Clientes
🌐
Web App (SPA)
React · gestión menús
📱
PDV integrations
Lightspeed · Square · Revel
🔗
API Pública v2
Terceros REST
Azure — West Europe
Edge / Ingreso
🚪
Azure Front Door
WAF · SSL · routing global
🔑
API Management
Throttling · versioning · portal dev
🆔
Entra ID B2C
Auth · RBAC · managed identity
Compute — App Layer
☁️
Container Apps
API Laravel · autoscaling KEDA
Azure Functions
Webhooks PDV · event triggers
🤖
Container Apps (ML)
Python inference · batch nocturno
Mensajería Asíncrona
📨
Service Bus
Exportaciones · webhooks · DLQ
📡
Event Grid
Pub/sub cambios menú → PDVs
📊
Event Hubs
Clickstream analítica · Parquet
Observabilidad
📈
Application Insights
Trazas · métricas · alertas
🔍
Log Analytics
Logs centralizados · KQL queries
🔐
Key Vault
Secretos · certs · sin credenciales hardcoded
Datos · Persistencia
🗄️
Azure SQL (Flex)
OLTP principal · zone-redundant
Redis Cache
Cache-aside · sesiones · p95 <5ms
🧊
Blob Storage
Imágenes · exports · modelos ML
🔬
Synapse Analytics
Analítica · pipeline ML nocturno
🌐
CDN Azure
Assets estáticos · imágenes menú
Patrones de Diseño Aplicados (Azure Architecture Center)

Queue-Based Load Leveling

Exportaciones y webhooks PDV pasan por Service Bus. Absorbe picos de almuerzo sin afectar la UI.

Reliability Performance

Cache-Aside (Redis)

Catálogos de menú se cargan en Redis bajo demanda. TTL 5 min. Reduce carga SQL en pico >70%.

Performance Cost Opt.

Publisher/Subscriber

Event Grid publica cambios de menú. PDVs suscritos reciben notificación sin polling activo.

Reliability Performance

CQRS

Escrituras al SQL transaccional; lecturas de reportes contra Redis/Synapse. Escala independiente.

Performance Reliability

Retry + Circuit Breaker

Todas las llamadas salientes a PDVs con backoff exponencial + jitter y circuit breaker (Polly).

Reliability

Strangler Fig

Migración incremental: Front Door redirige módulos migrados a Container Apps; monolito sigue activo.

Ops Excellence Reliability
Decisiones de Arquitectura (ADRs)
ADR-001 Container Apps en lugar de AKS ✓ Aceptada
Contexto

El equipo de 4 devs no tiene experiencia operando Kubernetes. Se necesita autoscaling y despliegue de contenedores, pero sin coste operativo de gestión de clúster.

Decisión

Usar Azure Container Apps (PaaS, Dapr opcional, KEDA autoscaling) para todos los microservicios incluyendo el modelo ML Python.

Consecuencias
  • ✅ Cero coste de gestión K8s
  • ✅ Escala a cero → ahorro nocturno
  • ⚠️ Menos control que AKS (aceptable)
  • ⚠️ Límites de recursos por contenedor
ADR-002 Arquitectura Web-Queue-Worker con Event-Driven para PDVs ✓ Aceptada
Contexto

Las exportaciones masivas bloqueaban la BD. Los webhooks a PDVs fallan en cascada si el PDV está lento. Necesitamos desacoplar ambos flujos.

Decisión

Service Bus para colas de exportaciones con DLQ. Event Grid para propagación de cambios de menú a PDVs (pub/sub, reintentos automáticos hasta 24h).

Consecuencias
  • ✅ UI desacoplada de exportaciones pesadas
  • ✅ Entrega garantizada con reintentos
  • ✅ Absorbe picos sin degradar API
  • ⚠️ Eventual consistency (aceptada por negocio)
ADR-003 Azure SQL Flex + Redis como capa de persistencia principal ✓ Aceptada
Contexto

El equipo domina SQL relacional (MySQL). El modelo de datos tiene relaciones complejas. Se necesita caché para absorber lecturas de catálogo en pico.

Decisión

Migrar MySQL → Azure SQL Flexible Server (zone-redundant). Redis Cache Enterprise para cache-aside. Cosmos DB descartado: complejidad no justificada con equipo actual.

Consecuencias
  • ✅ Curva de aprendizaje mínima
  • ✅ Cache reduce SQL reads >70% en pico
  • ✅ Zone-redundant: SLA 99.99% en BD
  • ⚠️ Límite escala horizontal (vs Cosmos)
ADR-004 Migración incremental con patrón Strangler Fig ✓ Aceptada
Contexto

Un big-bang migration es demasiado arriesgado con 120 clientes activos en producción y un equipo pequeño. Necesitamos migrar sin interrupción del servicio.

Decisión

Azure Front Door actúa como router. Se migra módulo a módulo. El monolito PHP coexiste 6-12 meses. Fase 1: gestión de menús. Fase 2: webhooks. Fase 3: reportes/ML.

Consecuencias
  • ✅ Riesgo distribuido en 4 fases
  • ✅ Rollback granular por módulo
  • ⚠️ Coste temporal de doble infra
  • ⚠️ Lógica de routing en Front Door
Revisión Well-Architected Framework (WAF)
Pilar Decisiones tomadas Estado Riesgo / Tradeoff
Reliability Zone-redundant SQL · Service Bus DLQ · Circuit Breaker en PDV calls · Health Endpoint en Container Apps · RTO 1h / RPO 15min con backup automático ✓ OK Sin multi-región activa (presupuesto). Failover manual a segunda región en DR.
Security Entra ID B2C · Managed Identity en todos los servicios · Key Vault para secretos · Front Door WAF · Private endpoints para SQL y Redis · Datos cifrados en tránsito y reposo ✓ OK GDPR: datos en West Europe. Revisar retención de logs en Log Analytics (90 días).
Cost Opt. Container Apps escala a cero en noche · Reserved instances SQL y Redis (1 año, -30%) · Blob Storage tiering frío para exports >30 días · CDN para assets estáticos ⚠ Revisar Coste dual durante Strangler Fig (monolito + Azure). Presupuesto ~3.400€/mes fase 1.
Ops Excellence IaC con Bicep/Terraform · GitHub Actions CI/CD · Application Insights + Log Analytics · Alertas automáticas en p95, error rate, queue depth · Runbooks documentados ✓ OK 4 devs asumen también operaciones. Invertir en alertas proactivas desde día 1.
Performance Redis Cache-Aside (catálogos TTL 5min) · CQRS para reportes · CDN para assets · KEDA autoscaling por métricas de cola · p95 <300ms validado en load test ✓ OK Medir baseline en monolito antes de migrar. Load test con k6 antes de cada fase.
Plan de Migración — Patrón Strangler Fig (4 fases)
1
Semanas 1–4

Fundación

  • Provisionar VNet, Front Door, APIM
  • Entra ID B2C + Managed Identities
  • Log Analytics + App Insights
  • Key Vault + secretos migrados
  • GitHub Actions pipeline base
2
Semanas 5–10

Gestión de Menús

  • API Laravel → Container Apps
  • MySQL → Azure SQL Flexible
  • Redis Cache para catálogos
  • CDN para imágenes de menú
  • Front Door rutea /api/menus
3
Semanas 11–16

Webhooks + Exportaciones

  • Service Bus para exportaciones
  • Event Grid → PDVs
  • Azure Functions para triggers
  • DLQ + alertas de cola
  • Retire exportaciones del monolito
4
Semanas 17–24

ML + Analítica + Decommission

  • Pipeline ML Python → Container Apps
  • Event Hubs + Synapse para analítica
  • CQRS: Synapse para read model
  • Load test final (k6)
  • Decommission monolito OVH
Estimación de Coste Mensual (Fase 2 en adelante)
Servicio SKU / Configuración €/mes Notas
Container Apps 4 apps · autoscaling 0-10 réplicas · 1 vCPU / 2 GB 380 Escala a cero fuera de pico → ahorro ~40%
Azure SQL Flexible General Purpose · 4 vCores · 20 GB · Zone-redundant 520 Reserved 1 año: -30% → ~364€
Redis Cache C2 Standard (6 GB) · Zone-redundant 180 Reduce carga SQL >70% en pico
Azure Front Door + WAF Standard · WAF policy · ~50M requests/mes 210 Global LB + DDoS incluido
Service Bus + Event Grid Standard · 5M mensajes/mes 60 DLQ incluido en Service Bus
API Management Developer tier (producción: Standard) 130 Escalar a Standard en fase 3
Blob Storage + CDN 100 GB LRS + 500 GB CDN egress 55 Tiering frío para exports >30 días
Log Analytics + App Insights 10 GB/día retención 90 días 140 Alertas y dashboards incluidos
Synapse Analytics Serverless SQL · pipeline ML nocturno 95 Pay-per-query; activo solo noche
Key Vault + Entra ID B2C Standard · 50.000 MAU B2C 75 Primeros 50.000 MAU incluidos en B2C
TOTAL FASE 2+ Con reservas anuales aplicadas ~1.845€ Dentro del presupuesto ≤4.000€/mes ✓