Saltar al contenido principal

Arquitectura del Sistema - Diagramas Completos


Arquitectura de Alto Nivel

Este diagrama muestra todos los componentes principales y cómo se comunican:

Arquitectura completa del sistema SwapBits
Click para ampliar (zoom y pan interactivo)

Patrones de Comunicación

1. Cliente → API (REST)

Usado para: Todas las operaciones CRUD, login, transacciones, etc.


2. Cliente ↔ WebSocket (Tiempo Real)

Usado para: Market data, chat, notificaciones en tiempo real.


3. Servicio → Lambda (Invocación)

Usado para: Creación de wallets, envío de transacciones.


4. Monitor → Blockchain (Polling)

Usado para: Detectar transacciones entrantes.


5. Webhook Externo → Sistema

Usado para: Webhooks de Bybit, Manteca, Bridge.


Arquitectura de Seguridad (Capas)


Flujo de Datos: Transacción Completa


Arquitectura de Datos

Relaciones clave:

  • Un User tiene múltiples Wallets
  • Una Wallet tiene múltiples Transactions
  • Un User puede tener múltiples Orders
  • Sessions se guardan en Redis (temporal)
  • Rate Limits en Redis (ultra-rápido)
  • Pub/Sub en Redis para eventos en tiempo real

Escalabilidad Horizontal

Estrategia de escalado:

  • Servicios: Se pueden replicar fácilmente (Docker)
  • Redis Pub/Sub: Coordina entre múltiples instancias
  • MongoDB Replica Set: Alta disponibilidad
  • Load Balancer: Distribuye tráfico equitativamente

Decisiones Arquitectónicas Explicadas

¿Por qué Pub/Sub en Redis?

Problema: Si tienes múltiples instancias de WS Service, ¿cómo envías un mensaje a todos los clientes conectados?

Solución: Redis Pub/Sub actúa como "broadcaster":

  1. Service A publica mensaje en canal notifications:user_123
  2. Todas las instancias WS escuchan ese canal
  3. La instancia que tiene al usuario conectado le envía el mensaje

Sin esto: Solo la instancia que recibe el evento podría notificar al usuario.

¿Por qué separar Monitors de Services?

Razones:

  1. Responsabilidad única: Monitors solo escuchan blockchain
  2. Escalabilidad: Puedes escalar monitors independientemente
  3. Tolerancia a fallos: Si un monitor falla, los servicios siguen funcionando
  4. Optimización: Monitors pueden tener su propio rate limiting con RPCs

Alternativa descartada: Integrar monitoring dentro de Wallet Service (demasiado acoplado).

¿Por qué Lambda para Wallets?

Razones:

  1. Seguridad: Cada ejecución es aislada
  2. Costo: Solo pagas cuando se crea una wallet (poco frecuente)
  3. Escalabilidad automática: AWS se encarga
  4. Sin estado: No necesita memoria entre ejecuciones

Alternativa descartada: Endpoint en Wallet Service (más complejo de escalar).


Puntos Críticos del Sistema

Single Points of Failure (SPOFs)

ComponenteImpacto si fallaMitigación
MongoDBSistema completo caeReplica Set con 3 nodos
RedisSin sesiones ni cacheRedis Sentinel o Cluster
Auth ServiceNo se puede loginMúltiples instancias + LB
WS ServiceSin tiempo realMúltiples instancias + Pub/Sub

Cuellos de Botella

ComponenteLímiteSolución
Blockchain RPCsRate limits de proveedoresMúltiples RPCs, rotación
MongoDB Writes~10k writes/secSharding (futuro)
Redis Pub/Sub~100k msgs/secSuficiente para MVP
WebSocket Connections~10k por instanciaEscalar horizontalmente

Próximos Pasos

Ahora que entiendes la arquitectura general, puedes profundizar en:

  1. Microservices: Detalles de cada servicio
  2. Flujos de negocio: Cómo se ejecutan operaciones completas
  3. Sistema de seguridad: Capas de protección
  4. Deployment: Cómo se despliega todo esto

Nota para Desarrolladores

Este diagrama es tu mapa. Imprímelo, ponlo en la pared. Cuando tengas un bug:

  1. Identifica qué servicio está involucrado
  2. Mira cómo se comunica con otros
  3. Revisa los logs de ese servicio específico
  4. Traza el flujo de datos

La arquitectura no es accidental, cada decisión tiene su razón de ser.