← Volver a proyectos

Plataforma SaaS multi-tenant para educación

Tech Lead / Fullstack

Problema

Servir a muchas organizaciones desde una sola plataforma garantizando que los datos de cada una queden completamente aislados, sin sacrificar mantenibilidad ni velocidad de entrega.

Impacto

Una base escalable y testeable que soporta el crecimiento por organización sin duplicar infraestructura.

El problema

Una sola plataforma debía atender a muchas organizaciones independientes. El requisito no negociable era el aislamiento de datos: ninguna organización podía ver, ni por error, la información de otra. A la vez, el negocio necesitaba entregar features rápido y mantener el código sano a medida que crecía.

La arquitectura

  • Hexagonal + DDD con bounded contexts aislados: el dominio no conoce la base de datos ni el framework, lo que mantiene la lógica testeable y portable.
  • Multi-tenant con Row-Level Security: cada consulta corre dentro del contexto del tenant; el filtrado por organización es obligatorio a nivel de base de datos, no opcional en el código.
  • Comunicación dirigida por eventos con outbox pattern y un contrato de eventos estándar, para que los cambios de estado se propaguen de forma confiable entre servicios sin acoplarlos.
  • Pipeline de calificación: una API recibe el trabajo, un worker en Go lo procesa de forma intensiva, y un dashboard muestra los resultados.
  • Autenticación con JWT firmado (RS256) y manejo seguro de tokens.

Decisiones clave

  • RLS sobre filtrado manual: confiar el aislamiento al motor de base de datos elimina toda una clase de bugs de seguridad por olvido del desarrollador.
  • Outbox en vez de publicar directo: garantiza que un evento solo se emite si la transacción que lo origina se confirmó. Adiós a los estados inconsistentes.
  • Worker en Go separado de la API: la carga pesada de cálculo escala de forma independiente del tráfico web.

Impacto

Una plataforma que crece sumando organizaciones sin reescribir el núcleo ni duplicar infraestructura, con una frontera de seguridad clara y un código que se puede testear y mantener.