Resumen

r10c es una plataforma de marketplace, y la aplicación de la que se extrajo entifix. Su negocio se nombra a partir de los mapas del TM Forum de la industria de telecomunicaciones: once dominios y sus entidades —ofertas, especificaciones, partes, órdenes, pagos, liquidaciones— toman sus nombres y sus límites de ODA y SID, los mismos marcos sobre los que planifiqué la migración de Tigo.

Los datos se dividen en tres planos. El plano de control guarda las partes, los accesos y los acuerdos; el plano de plataforma, el catálogo publicado y las órdenes de los compradores; el plano de tenant, lo que cada vendedor crea, una base de datos por organización, alcanzada solo a través del manejador que resuelve la sesión. Ninguna entidad lleva un id de organización, así que ninguna consulta puede filtrar filas de otro tenant por olvidar un filtro.

Los servicios son programas de Effect sobre los casos de uso de entifix, con MongoDB y PostgreSQL. Una escritura pasa por una fachada transaccional que bloquea en Redis y envía su evento junto con ella por RabbitMQ; los flujos de varios pasos, como el checkout, son sagas declaradas como datos, y cada paso sabe qué deshacer. Zitadel autentica a los usuarios; r10c los autoriza y emite sus propios tokens. Todo corre sobre Kubernetes, con trazas de OpenTelemetry en Grafana, y cada una de sus decisiones es un registro más abajo.

Patrones

  1. Nombrado desde SID

    Los dominios, las entidades y sus límites vienen de ODA y SID del TM Forum, así que el modelo habla un lenguaje que la industria ya comparte.

  2. Tres planos, una base de datos por tenant

    Los datos de control, de plataforma y de tenant viven separados. El tenant es la base de datos a la que se resuelve una petición, nunca un filtro que una consulta pueda olvidar.

  3. El evento viaja con la escritura

    Una escritura y el evento que la anuncia salen juntos, con el id de transacción del cliente, y un bus los enruta con reintentos y cuarentena.

  4. Sagas como datos

    Un flujo de varios pasos es una definición declarada, orquestada por flujo, y cada compensación sabe qué deshizo su paso.

  5. Autenticar allá, autorizar aquí

    Zitadel autentica a los usuarios; r10c guarda sus propias sesiones, emite sus propios tokens y lleva en ellos el rol de la parte y sus permisos.

  6. Las convenciones son verificaciones

    Una convención que solo se enuncia se salta, así que cada una es una verificación: i18n obligatorio, límites entre módulos, el registro de slices.

Estructura de archivos

  • apps/Los despliegues: dos frontends en Next.js y los servicios nativos de Effect.
  • packages/
  • infra/
    • local/La plataforma local sobre minikube: MongoDB, PostgreSQL, Redis, RabbitMQ, Zitadel y Grafana.
  • tools/
    • slices/El registro de stores y slices; el build falla cuando la documentación se desvía de él.
  • docs/
    • adr/Sus registros de decisiones, uno por cada elección que le dio forma.