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.

System design

CLIENTSEDGESERVICES · K8S HADATA & TELEMETRYHTTPSauthenticateroutegRPCpublishprocessarchivetracesReact dashboardstenant UIsYARP Gatewayauth-first routingIdentity Serviceauthn · tokensMicroservices ×NgRPC · Redis per svcWallet Servicebalances · txnsKafkahigh-throughput ingressSQL Serveroperational dataClickHousecold archiveSigNoz · SplunkOTel traces · errors