Saltar a contenido

Diagramas C4 — Bazaar

Documentación de arquitectura del sistema Bazaar siguiendo el C4 Model: Contexto (Nivel 1), Contenedores (Nivel 2) y Componentes (Nivel 3).

Los diagramas se generan desde un único modelo en workspace.dsl (Structurizr DSL, la herramienta oficial del modelo C4) y se renderizan con Kroki al construir el sitio. Cada vista sale del mismo modelo cambiando solo el view-key, así que basta editar el DSL para mantener todas las vistas en sincronía.

Bazaar es un marketplace donde cualquier usuario puede comprar y vender. El sistema está construido como una arquitectura de microservicios poliglota, con comunicación REST sincrónica (a través de un API Gateway) y mensajería asincrónica orientada a eventos (RabbitMQ) para los flujos donde la consistencia eventual es aceptable (stock, notificaciones).


Stack tecnológico

Contenedor Tecnología Persistencia Comunicación
mobileApp React Native + Expo (TypeScript) SecureStore (local) REST → Kong
backoffice React + Vite + TailwindCSS (TypeScript) REST → Kong
user-service Python · FastAPI · SQLAlchemy · Alembic PostgreSQL REST + (servidor)
product-service Python · FastAPI MongoDB REST + RabbitMQ
checkout-service Python · FastAPI · SQLAlchemy · Alembic PostgreSQL (Supabase en prod) REST + RabbitMQ
notification-service Go MongoDB REST + RabbitMQ + Push
lib-moniobs Python (lib compartida) Sentry / health / middleware
API Gateway Kong 3.9 (OSS, Gateway API) Ingress HTTP
Message Broker RabbitMQ 3.13 AMQP (topic + DLX)
Infra GKE · Helm · ArgoCD · Prometheus · Grafana GitOps

Nivel 1 — Diagrama de Contexto

Vista de alto nivel: quién usa Bazaar y con qué sistemas externos se integra.

System Context View: BazaarComprador / Vendedor[Person] La misma cuenta compra y vende.Visitante[Person] Explora el catálogo sin autenticarse.Administrador[Person] Modera y consulta métricas.MercadoPago[Software System] Gateway de pagos (mock).Supabase[Software System] OAuth Google + PostgreSQL.Cloudinary[Software System] CDN de imágenes.Servicios de Push[Software System] Expo Push y Web Push.Bazaar[Software System] Marketplace: usuarios, catálogo,checkout, órdenes y notificaciones.Usa[HTTPS]Explora y busca[HTTPS]Usa[HTTPS]Procesa pagos[HTTPS]Persiste órdenes(prod)[PostgreSQL]Sube imágenes[HTTPS]Entreganotificaciones[HTTPS]

Nivel 2 — Diagrama de Contenedores

Vista de las unidades desplegables dentro de Bazaar y cómo se comunican entre sí. Cada microservicio es dueño exclusivo de su base de datos (Database per Service).

Container View: BazaarBazaar[Software System]Mobile App[Container: React Native / Expo] App de compra y venta parausuarios finales.Backoffice[Container: React + Vite] Panel de administración.API Gateway[Container: Kong 3.9] Punto de entrada único:enrutamiento, TLS, rate-limiting.User Service[Container: Python / FastAPI] Registro, login, perfiles, admin deusuarios.User DB[Container: PostgreSQL] Usuarios, credenciales, sesiones,dispositivos.Product Service[Container: Python / FastAPI] Catálogo, búsqueda, stock,moderación.Product DB[Container: MongoDB] Productos, categorías, imágenes,wishlist.Checkout Service[Container: Python / FastAPI] Carrito, checkout, órdenes, pagos,cupones, reviews.Checkout DB[Container: PostgreSQL] Carritos, órdenes, transiciones,cupones, reviews.Notification Service[Container: Go] Consume eventos y entreganotificaciones.Notification DB[Container: MongoDB] Suscripciones push y notificacionesemitidas.Message Broker[Container: RabbitMQ 3.13] Exchanges topic con DLX: payments,orders, stock.Comprador / Vendedor[Person] La misma cuenta compra y vende.Visitante[Person] Explora el catálogo sin autenticarse.Administrador[Person] Modera y consulta métricas.MercadoPago[Software System] Gateway de pagos (mock).Supabase[Software System] OAuth Google + PostgreSQL.Cloudinary[Software System] CDN de imágenes.Servicios de Push[Software System] Expo Push y Web Push.Lee/escribe[SQL]RESTValida vendedor[REST]RESTConsultausuarios/direcciones[REST]Lee/escribe[Mongo]Publicastock.updated[AMQP]Consumepayment.*[AMQP]Lee/escribe[SQL]Publicapayment.* /order.status_changed[AMQP]order.status_changed[AMQP]Lee/escribe[Mongo]Usa[HTTPS]Explora y busca[HTTPS]Usa[HTTPS]Llama API REST[HTTPS/JSON]Llama API REST[HTTPS/JSON]Enruta /users[HTTP]Enruta/products[HTTP]Enruta/checkout,/orders, /cart[HTTP]Enruta/notifications[HTTP]Consultaproductos ystock[REST]Resuelve emails[REST]Enriqueceproducto[REST]Enriquece orden[REST]Procesa pagos[HTTPS]Persiste órdenes(prod)[PostgreSQL]OAuth Googlefederado[HTTPS]Sube imágenes[HTTPS]Entreganotificaciones[HTTPS]

Mensajería — Topología de eventos

La comunicación asincrónica usa RabbitMQ con tres topic exchanges durables, cada uno con su Dead Letter Exchange (DLX) para mensajes no procesables.

flowchart LR
    subgraph CO[Checkout Service]
        coPub["Publisher"]
    end
    subgraph PR[Product Service]
        prCons["Stock Consumer"]
        prPub["Stock Publisher"]
    end
    subgraph NO[Notification Service]
        noOrd["Order Consumer"]
        noStk["Stock Consumer"]
    end

    coPub -- "payment.confirmed / payment.rejected" --> EXp{{bazaar.payments}}
    EXp -- "product.stock.confirm / .reject" --> prCons
    prCons -. "descuenta / restaura stock" .-> PRDB[(MongoDB)]

    coPub -- "order.status_changed" --> EXo{{bazaar.orders}}
    EXo --> noOrd
    noOrd -. "push al comprador" .-> PUSH1[/Expo / Web Push/]

    prPub -- "stock.updated" --> EXs{{bazaar.stock}}
    EXs --> noStk
    noStk -. "alerta stock bajo al vendedor" .-> PUSH2[/Expo / Web Push/]

    EXp -. no procesable .-> DLXp[(bazaar.payments.dlx)]
    EXo -. no procesable .-> DLXo[(bazaar.orders.dlx)]
    EXs -. no procesable .-> DLXs[(bazaar.stock.dlx)]

Saga de stock (consistencia eventual): el checkout no descuenta stock directamente. Al confirmarse/rechazarse un pago publica payment.confirmed / payment.rejected; el product-service consume el evento y ajusta el stock de forma idempotente (con event_id). Esto desacopla el cobro del descuento de stock y permite reintentos sin doble efecto.


Nivel 3 — Diagramas de Componentes

Checkout Service (componentes)

El servicio más complejo: orquesta carrito, checkout transaccional, órdenes, cupones, reviews y métricas.

Component View: Bazaar - Checkout ServiceBazaar[Software System]Checkout Service[Container: Python / FastAPI]User Service[Container: Python / FastAPI] Registro, login, perfiles, admin deusuarios.Product Service[Container: Python / FastAPI] Catálogo, búsqueda, stock,moderación.Checkout DB[Container: PostgreSQL] Carritos, órdenes, transiciones,cupones, reviews.Message Broker[Container: RabbitMQ 3.13] Exchanges topic con DLX: payments,orders, stock.Cart API[Component: FastAPI Router] Agregar/quitar items, ver carrito.Checkout API[Component: FastAPI Router] Confirma compra e inicia pago.Order API[Component: FastAPI Router] Estado, seguimiento e historial deórdenes.Coupon API[Component: FastAPI Router] Crear/gestionar/aplicar cupones.Review API[Component: FastAPI Router] Calificar producto y vendedor.Admin Orders API[Component: FastAPI Router] Listado/búsqueda de órdenes (sololectura).Metrics API[Component: FastAPI Router] Métricas del sistema y por categoría.Checkout Service[Component: Lógica] Transacción, idempotencia,concurrencia de stock.Cart Service[Component: Lógica] Gestión del carrito y validación destock.Order Service[Component: Lógica] Máquina de estados de la orden.Coupon Service[Component: Lógica] Validación y aplicación dedescuentos.Review Service[Component: Lógica] Reglas de calificación post-entrega.Metrics Service[Component: Lógica] Agregaciones y exportación.Repositories[Component: SQLAlchemy] Acceso a datos (carritos, órdenes,cupones, reviews).MercadoPago Client[Component: Cliente HTTP] Integración de pagos (real o mock).Product Client[Component: Cliente HTTP] Consulta /products/batch y stock.User Client[Component: Cliente HTTP] Consulta usuarios y direcciones.Resilience[Component: Tolerancia a fallos] Retry / Circuit Breaker.Event Publisher[Component: aio-pika] Publica payment.* yorder.status_changed.Order Expiry Task[Component: Background task] Expira órdenes pendientes de pago.MercadoPago[Software System] Gateway de pagos (mock).RESTValida vendedor[REST]Publicastock.updated[AMQP]Consumepayment.*[AMQP]       Lee carritoAplica cupónCobraVerifica stockPublicapayment.*Publicaorder.status_changed     Expira órdenes  Lee/escribe[SQL]Procesa pagos[HTTPS]RESTRESTPublicapayment.* /order.status_changed[AMQP]

Product Service (componentes)

Component View: Bazaar - Product ServiceBazaar[Software System]Product Service[Container: Python / FastAPI]User Service[Container: Python / FastAPI] Registro, login, perfiles, admin deusuarios.Product DB[Container: MongoDB] Productos, categorías, imágenes,wishlist.Message Broker[Container: RabbitMQ 3.13] Exchanges topic con DLX: payments,orders, stock.Products API[Component: FastAPI Router] Listado, búsqueda, detalle,publicación, wishlist.Admin API[Component: FastAPI Router] Moderación: habilitar/deshabilitarproductos.Product Service[Component: Lógica] Reglas de catálogo, stock, visibilidady moderación.Product Repository[Component: Motor / PyMongo] Persistencia en MongoDB.Seller Client[Component: Cliente HTTP] Valida que el vendedor exista enuser-service.Image Uploader[Component: Cliente Cloudinary] Sube y administra imágenes.Stock Publisher[Component: aio-pika] Publica stock.updated.Stock Consumer[Component: aio-pika] Consume payment.* y ajusta stock.Cloudinary[Software System] CDN de imágenes.   Valida vendedorSube imágenesNotifica cambiosde stockDescuenta/restaurastockLee/escribe[Mongo]RESTHTTPSPublicastock.updated[AMQP]Consumepayment.*[AMQP]

User Service (componentes)

Component View: Bazaar - User ServiceBazaar[Software System]User Service[Container: Python / FastAPI]User DB[Container: PostgreSQL] Usuarios, credenciales, sesiones,dispositivos.Product Service[Container: Python / FastAPI] Catálogo, búsqueda, stock,moderación.Checkout Service[Container: Python / FastAPI] Carrito, checkout, órdenes, pagos,cupones, reviews.Auth API[Component: FastAPI Router] Registro, login email/PIN/biométrico,recupero, federado.User API[Component: FastAPI Router] Perfil propio y público, edición.Admin API[Component: FastAPI Router] Listar usuarios,bloquear/desbloquear.Auth Service[Component: Lógica] Credenciales, tokens, sesiones,rate-limit.User Service[Component: Lógica] Datos de perfil y reglas devisibilidad.Admin Service[Component: Lógica] Moderación de cuentas.Repositories[Component: SQLAlchemy] Acceso a datos.Product Client[Component: Cliente HTTP] Publicaciones del usuario para elperfil.Order Client[Component: Cliente HTTP] Datos de órdenes para reputación.Supabase[Software System] OAuth Google + PostgreSQL.  Verifica OAuth[HTTPS]Publicacionesdel perfilReputación /historialLee/escribe[SQL]RESTRESTConsultaproductos ystock[REST]Persiste órdenes(prod)[PostgreSQL]    

Notification Service (componentes)

Component View: Bazaar - Notification ServiceBazaar[Software System]Notification Service[Container: Go]User Service[Container: Python / FastAPI] Registro, login, perfiles, admin deusuarios.Checkout Service[Container: Python / FastAPI] Carrito, checkout, órdenes, pagos,cupones, reviews.Notification DB[Container: MongoDB] Suscripciones push y notificacionesemitidas.Message Broker[Container: RabbitMQ 3.13] Exchanges topic con DLX: payments,orders, stock.HTTP Handlers[Component: Go / net/http] Registro de suscripciones push yconsulta.Order Consumer[Component: Go / amqp] Consume order.status_changed.Stock Consumer[Component: Go / amqp] Consume stock.updated.Notification Service[Component: Lógica] Decide destinatario y construye elmensaje.Repository[Component: mongo-driver] Suscripciones y notificacionesemitidas.User Client[Component: Cliente HTTP] Resuelve email delcomprador/vendedor.Checkout Client[Component: Cliente HTTP] Enriquece datos de la orden.Expo Push[Component: Cliente HTTP] Notificaciones a la app móvil.Web Push[Component: VAPID] Notificaciones al navegador.Servicios de Push[Software System] Expo Push y Web Push.RESTConsultausuarios/direcciones[REST]Publicapayment.* /order.status_changed[AMQP]order.status_changed[AMQP]stock.updated[AMQP]  GuardasuscripciónPersistenotificaciónResuelve emailEnriquece ordenEnvíaEnvíaLee/escribe[Mongo]RESTRESTHTTPSHTTPS

Infraestructura y despliegue

Despliegue sobre Google Kubernetes Engine (GKE) con modelo GitOps.

flowchart TB
    dev[Desarrollador] -->|git push| repos[(Repos GitHub<br/>+ GHCR images)]
    repos -->|sync| argo[ArgoCD]
    argo -->|aplica manifiestos| k8s

    subgraph k8s[GKE Cluster]
        direction TB
        kong[Kong Gateway<br/>Gateway API / HTTPRoute]
        subgraph apps[Namespace de aplicación]
            us[user-service]
            ps[product-service]
            cs[checkout-service]
            ns[notification-service]
            rmq[RabbitMQ]
        end
        subgraph mon[Namespace monitoring]
            prom[Prometheus<br/>kube-prometheus-stack]
            graf[Grafana]
        end
    end

    kong --> us & ps & cs & ns
    us & ps & cs & ns -->|ServiceMonitor /metrics| prom
    prom --> graf
  • API Gateway: Kong 3.9 OSS con ingress controller (Gateway API / HTTPRoute). Punto de entrada único; el cliente nunca habla directo con un microservicio.
  • GitOps: ArgoCD (infra/argocd) sincroniza el chart helm/bazaar-service por servicio (.argocd-source-*.yaml). Imágenes publicadas en GHCR (ghcr-pull secret).
  • Observabilidad: kube-prometheus-stack (Prometheus + Grafana + kube-state-metrics). Cada servicio expone un ServiceMonitor y /metrics. Dashboards versionados en helm/grafana-dashboards. La librería compartida lib-moniobs integra Sentry, health checks y middleware de observabilidad en los servicios Python.
  • Broker: RabbitMQ desplegado vía helm/rabbitmq.
  • Despliegue local: cada servicio trae su compose.yml que levanta el stack completo (servicio + dependencias + RabbitMQ + Mongo/Postgres). MERCADOPAGO_MOCK_MODE=true permite correr el checkout sin pegarle a MercadoPago real.

Decisiones de arquitectura relevantes

Decisión Detalle
Microservicios poliglotas Python/FastAPI para dominio transaccional; Go para el servicio de notificaciones (alta concurrencia de consumo de eventos y fan-out de push).
Database per Service Cada servicio es dueño de su DB. PostgreSQL donde importa la transaccionalidad (user, checkout); MongoDB donde el modelo es flexible y orientado a documentos (product, notification).
API Gateway único (Kong) Centraliza enrutamiento, TLS y rate-limiting. Desacopla a los clientes de la topología interna.
Mensajería event-driven (RabbitMQ) Stock y notificaciones se resuelven por eventos (consistencia eventual), desacoplando el checkout del product y notification. Topic exchanges + DLX para resiliencia.
Saga de stock por eventos El stock se descuenta cuando product-service consume payment.confirmed, no en el checkout. Idempotencia por event_id evita doble descuento ante reintentos.
Pago externo desacoplado Cliente de MercadoPago con retry + circuit breaker y modo mock. Idempotencia de pago para evitar doble cobro ante errores de red.
Identidad federada vía Supabase Google OAuth delegado a Supabase; reduce el manejo directo de credenciales de terceros.
GitOps con ArgoCD Estado declarativo del cluster en Git; despliegue reproducible y auditable.
Librería de observabilidad compartida lib-moniobs unifica Sentry, health y métricas en los servicios Python, evitando duplicación.