Microservices And Messaging · TL;DR
1 min readTL;DR
The backend is a set of independent .NET microservices (target framework net10), one per bounded concern — Tenant/identity, Questioner, OnlineMenu, Content, Notification, Payment, and Kefi. Each service is built the same way: FastEndpoints for the HTTP surface, EF Core over PostgreSQL for persistence, Clean Architecture layering, and Central Package Management to pin dependency versions in one place. Services authenticate via Keycloak, where every product gets its own realm so its users are isolated, and a shared auth library enforces a "realm wall" between products. Tenant data is isolated by a TenantId on every tenant-owned row plus a global EF Core query filter. Services stay decoupled by talking asynchronously over RabbitMQ (via MassTransit) — publishing domain events that other services consume — falling back to a few guarded synchronous internal HTTP calls only when a request truly needs an answer right now. Files live in S3-compatible object storage behind the Content service. Frontends reach the backend through a per-product BFF, and everything sits behind Traefik for TLS and host routing.