Patrones de Arquitectura
La elección del patrón de arquitectura es una de las decisiones con mayor impacto a largo plazo. No existe un patrón universal — cada uno resuelve problemas específicos y trae sus propios costos. Esta guía te ayuda a tomar esa decisión con criterio.
Patrones de Arquitectura — Cuándo Usar Cada Uno
Anatomía de Patrones — Flujo Arquitectónico
Cómo se conectan los componentes en cada patrón adoptado en HERA
Microservicios
Sección titulada «Microservicios»Cuándo es el patrón correcto
Sección titulada «Cuándo es el patrón correcto»- Dominios claramente separados con equipos autónomos (ej: ecommerce tiene catálogo, carrito, pagos, envíos como servicios independientes)
- Escalado diferenciado — un servicio recibe 100x más tráfico que otro
- Equipos de 5+ personas que necesitan desplegar independientemente
- Tecnologías mixtas — un servicio en Node.js, otro en Java, otro en Python
Anatomía en HERA
Sección titulada «Anatomía en HERA»Cada servicio:
- Tiene su propio repositorio en GitLab siguiendo la estructura de repos
- Tiene su propio pipeline CI/CD
- Se despliega como un Pod independiente en GKE
- Tiene su propia base de datos (no comparte schemas)
- Se comunica vía HTTP/gRPC (síncrono) o Pub/Sub (asíncrono)
Anti-Patterns
Sección titulada «Anti-Patterns»- Base de datos compartida entre servicios → rompe la autonomía
- Llamadas síncronas en cascada → crea acoplamientos frágiles
- Orquestación centralizada → prefiere coreografía vía eventos
- Demasiados servicios para un equipo pequeño → overhead operacional insostenible
BFF (Backend for Frontend)
Sección titulada «BFF (Backend for Frontend)»Cuándo es el patrón correcto
Sección titulada «Cuándo es el patrón correcto»- Múltiples clientes con necesidades diferentes: app web (datos ricos), app móvil (datos ligeros), API para terceros (estructura estable)
- Equipos frontend que necesitan evolucionar la API de su cliente sin afectar a otros
Anatomía en HERA
Sección titulada «Anatomía en HERA»Cada BFF:
- Pertenece al equipo frontend que lo consume
- Agrega, filtra y transforma datos de los servicios core
- Puede tener lógica de caché y formateo específica del canal
- Se despliega con el Golden Pipeline de HERA
Event-Driven
Sección titulada «Event-Driven»Cuándo es el patrón correcto
Sección titulada «Cuándo es el patrón correcto»- Operaciones asíncronas que no necesitan respuesta inmediata (envío de emails, procesamiento de pedidos, sincronización de inventarios)
- Integración entre dominios donde no quieres acoplamiento directo
- Alta tolerancia a fallos — si un consumer falla, los mensajes se retienen
Anatomía en HERA
Sección titulada «Anatomía en HERA»HERA utiliza Google Cloud Pub/Sub como backbone de mensajería.
Estándares de eventos en HERA
Sección titulada «Estándares de eventos en HERA»{ "eventId": "uuid-v4", "eventType": "order.created", "source": "ecommerce.orders", "timestamp": "2026-04-02T10:30:00Z", "version": "1.0", "data": { "orderId": "ORD-12345", "customerId": "USR-67890", "total": 1500.00 }}| Campo | Obligatorio | Descripción |
|---|---|---|
eventId | Sí | UUID único del evento |
eventType | Sí | {dominio}.{entidad}.{acción} en dot-notation |
source | Sí | Servicio que emite el evento |
timestamp | Sí | ISO 8601 con timezone |
version | Sí | Versión del schema del evento |
data | Sí | Payload específico del evento |
Monolito Modular
Sección titulada «Monolito Modular»Cuándo es el patrón correcto
Sección titulada «Cuándo es el patrón correcto»- Producto nuevo o MVP que necesita velocidad de entrega
- Equipo pequeño (2-5 personas) donde la coordinación inter-servicio es overhead puro
- Dominio de negocio simple que no justifica la complejidad de microservicios
Anatomía en HERA
Sección titulada «Anatomía en HERA»Reglas para que un monolito no se convierta en un monolito desordenado:
- Módulos con boundaries claros — cada módulo expone una API interna, no accede directamente a las tablas de otro módulo
- Un módulo = un dominio de negocio (usuarios, pedidos, reportes)
- Tests por módulo — cada módulo tiene sus propios tests unitarios y de integración
- Preparado para extraer — si un módulo crece, puede convertirse en microservicio sin reescribir
API Gateway
Sección titulada «API Gateway»En HERA, el API Gateway es el punto de entrada único para todo tráfico externo hacia los servicios. Se implementa con Google Cloud Load Balancer + Cloud Armor + Ingress Controller en GKE.
Responsabilidades del Gateway
Sección titulada «Responsabilidades del Gateway»| Función | Implementación |
|---|---|
| TLS termination | Cloud Load Balancer |
| Rate limiting | Cloud Armor policies |
| Autenticación | JWT validation / OAuth 2.0 |
| Routing | Ingress Controller (path-based) |
| DDoS protection | Cloud Armor |
| CORS | Configuración en Ingress |
Anti-Pattern
Sección titulada «Anti-Pattern»No pongas lógica de negocio en el Gateway. Su responsabilidad es cross-cutting concerns (auth, rate limit, routing), no transformación de datos ni orquestación.
CQRS (Command Query Responsibility Segregation)
Sección titulada «CQRS (Command Query Responsibility Segregation)»Cuándo es el patrón correcto
Sección titulada «Cuándo es el patrón correcto»- Lecturas y escrituras tienen patrones radicalmente diferentes (muchas lecturas vs. pocas escrituras complejas)
- Reporting pesado que requiere modelos desnormalizados
- Audit trail completo donde necesitas reconstruir el estado en cualquier punto del tiempo
Matriz de Decisión
Sección titulada «Matriz de Decisión»Usa esta tabla para guiar tu elección:
| Criterio | Monolito Modular | Microservicios | BFF | Event-Driven | CQRS |
|---|---|---|---|---|---|
| Equipo < 5 personas | ✅ | ❌ | ➖ | ➖ | ❌ |
| Múltiples equipos autónomos | ❌ | ✅ | ➖ | ✅ | ➖ |
| Múltiples canales (web+mobile) | ➖ | ➖ | ✅ | ➖ | ➖ |
| Operaciones asíncronas | ➖ | ➖ | ➖ | ✅ | ➖ |
| Escalado diferenciado | ❌ | ✅ | ➖ | ✅ | ➖ |
| Reporting pesado | ➖ | ➖ | ➖ | ➖ | ✅ |
| Velocidad de entrega inicial | ✅ | ❌ | ➖ | ❌ | ❌ |
| Costo operacional bajo | ✅ | ❌ | ➖ | ➖ | ❌ |
Leyenda: ✅ Recomendado · ❌ No recomendado · ➖ Depende del contexto