SaaS & Platforms
Multi-Tenant SaaS Platform
Mediana — cloud-native backend + React dashboards
- Role
- Lead Full Stack Engineer (Mediana)
- Period
- 2024 – present
- Scale
- ~2k RPS production
- Latency
- p99 60ms on hot endpoints
Overview
The multi-tenant SaaS platform I lead at Mediana: a YARP API gateway fronts a fleet of .NET 10 microservices — every request is authenticated against the identity service first, then routed to the owning service. Service-to-service calls ride gRPC, each service keeps its own Redis cache, and Apache Kafka absorbs the high-throughput ingress and chains the downstream processing stages — hot endpoints hold a p99 of 60ms at roughly 2,000 requests per second.
The platform runs its own wallet service for balances and transactions. Everything deploys to Kubernetes with high availability; SQL Server serves the operational data while ClickHouse archives cold history at column-store compression to cut storage costs. OpenTelemetry traces every processing step into SigNoz for latency analysis, and errors ship to Splunk.
Private company repositories — the diagram shows the production topology, not a public file inventory.
- Mediana (private)company GitLab
Tech stack
Edge & services
- YARP gateway
- Identity service
- .NET 10/8
- C#
- gRPC
Data & messaging
- Apache Kafka
- Redis (per service)
- SQL Server
- ClickHouse archive
Front-end
- React
- TypeScript
Ops & observability
- Kubernetes (HA)
- Docker
- Azure
- OpenTelemetry
- SigNoz
- Splunk
Design patterns
Auth-first gateway
Every request authenticates against the identity service before YARP routes it — services trust the gateway boundary, never the raw caller.
gRPC inside, HTTP outside
Public traffic speaks HTTP at the gateway; between services it is typed gRPC contracts for low-latency internal calls.
Kafka-buffered processing
High-throughput ingress lands on Kafka and fans out through processing stages, so bursts never back-pressure the request path — that is what holds p99 at 60ms.
Cache per service
Each microservice owns its Redis cache — hot reads stay local and no service couples to another through shared cache state.
Hot/cold storage split
Operational data lives in SQL Server; history archives into ClickHouse, whose columnar compression is a large part of the storage-cost reduction.
Traced end to end
OpenTelemetry spans every hop into SigNoz — per-stage timings and latency come from traces, not guesses — while error streams feed Splunk.