Skip to Content
📘 ClubUp v0.1 — koncepčný návrh. Implementácia ešte nezačala.
ArchitektúraŠkálovanie

Stratégia škálovania

Predpoklady

  • Štart: 0–500 študentov v prvom roku (1 kurz, 4 úrovne)
  • Stredná fáza: 500–5 000 študentov (3–5 kurzov)
  • Cieľ: 5 000+ študentov (10+ kurzov, kluby objednávajú batch)

Toto sú veľmi malé čísla v porovnaní s typickým e-commerce. Hlavné výzvy nie sú QPS, ale video bandwidth a webinár concurrency.

Vrstvy

Marketingový web

  • Statický build na Vercel CDN — neobmedzene škáluje
  • Žiadny problém ani pri news article hit (10k req/min)

Aplikácie (Next.js)

  • Vercel serverless functions — autoscaling
  • Limit: 1000 concurrent invocations (Pro plán) → s priemerom 500ms/request to je ~2000 RPS
  • Pre cold starts používame Edge runtime kde sa dá (auth callback, jednoduché GET)

MongoDB Atlas

TierCena (~)RAMvCPUStorageVhodné pre
M0 (free)00.5 GBshared0.5 GBdev
M10$0.08/h2 GB210 GBstart, do 1k používateľov
M20$0.20/h4 GB220 GB1k–5k používateľov
M30$0.54/h8 GB240 GB5k+

Naše queries sú jednoduché (find by id, find by slug, range query na progress). Žiadne joins, žiadne agregácie nad miliónmi dokumentov.

Indexy (bude detailne v packages/db/indexes.ts):

  • courses.slug (unique)
  • enrollments.{studentId, courseId} (unique compound)
  • enrollments.studentId (pre dashboard)
  • progress.{enrollmentId, lessonId} (unique compound)
  • orders.studentId
  • orders.state (pre cleanup expired pending)
  • webhook_events.eventId (unique)
  • audit_logs.{actor, timestamp}

Mux (video)

  • Adaptive bitrate → každý klient dostane optimálnu kvalitu pre svoje pripojenie
  • Edge delivery — Mux má vlastný CDN
  • Cena: ~$0.005/min sledovania (cca 5 €/mesiac za 1000 minút sledovania)
  • Pri 500 študentoch × 60 hodín obsahu × 30 min priemer pozretého = drahé
  • Mitigácia: signed URLs s expiráciou, žiadny re-encoding, používame Mux pre HLS only (nie MP4)

Alternatíva pre dlhú budúcnosť: Cloudflare Stream alebo self-hosted (mediaCMS), ak Mux je príliš drahý.

24-pay

  • Žiaden bottleneck — bežná rýchlosť ~200 platieb/minútu na merchant účet
  • Náš expected throughput: 5–20 platieb / deň (väčšina kurzov sa kupuje raz)
  • Webhook delay je obvykle < 5 sekúnd

Email (Resend)

  • Free tier: 3000 emailov/mesiac, 100/deň
  • Pro: $20/mesiac za 50k emailov
  • Náš throughput: confirmation po platbe + reminders → ~5k emailov/mesiac → free + buffer
  • Newsletter pôjde cez MailerLite (oddelené od transakčných)

Live výučba (Teams)

  • Microsoft Teams má limit 1000 účastníkov per meeting (Standard) / 10000 (Premium)
  • Náš cieľ: 50–200 účastníkov / webinár
  • Žiaden škálovací problém

Bottlenecks na ktoré dávame pozor

1. „Webinar storm”

Keď 200 ľudí sa naraz pripojí na webinár cez aplikáciu → lavica requests na /api/webinars/{id}/join → vygeneruje sa Teams join URL.

Mitigácia:

  • Generujeme join URL pri vytvorení webinára, nie at request time
  • URL sa cache-uje na CDN s Cache-Control: private, max-age=600
  • Pre študenta je to len redirect na Teams

2. „Test storm”

Webinár končí, 200 ľudí naraz spustí záverečný test.

Mitigácia:

  • Test je load-ed v batches (10 otázok naraz)
  • Submit je synchrónna Server Action s rate limit 1/sec/user
  • Vyhodnotenie je rýchle (in-memory comparison v Server Action)

3. „Mux signed URL spam”

Útočník volá v cykle endpoint pre signed URL, aby distribuoval naše videá.

Mitigácia:

  • Rate limit 30/min/user na /api/lessons/{id}/playback-url
  • Signed URL má expiráciu 6 hodín, viazané na playback_id
  • Audit log podozrivých enumeration patterns

4. „MongoDB connection pool”

Vercel serverless funkcie môžu vytvoriť stovky connection-ov pri spike. MongoDB má connection limit (M10 = 1500).

Mitigácia:

  • Connection pooling v packages/db/client.ts — globálny MongoClient per Lambda invocation, reused medzi requestami v rámci toho istého container
  • Vercel automaticky reuses warm functions, takže pool zostáva
  • Plus: pre čítanie public dát používame MongoDB Atlas Data API alebo read replicas (M30+)

Cost forecast (rough)

Pre 1000 aktívnych študentov / mesiac:

PoložkaCena / mesiac
Vercel Pro$20
MongoDB Atlas M10$60
Mux (15k min sledovania)$75
Upstash Redis (rate limiting)$5
Resend (5k emailov)$0 (free tier)
Sentry (10k events)$0 (free tier)
Inngest (5k events)$0 (free tier)
Total~$160 / mesiac

Pre 10 000 aktívnych študentov:

PoložkaCena / mesiac
Vercel Pro$20
MongoDB Atlas M30$400
Mux (150k min sledovania)$750
Upstash Redis$20
Resend Pro$20
Sentry Team$26
Inngest Pro$30
Total~$1 270 / mesiac

To je ~13 € / aktívny študent / mesiac, čo je únosné pri cene kurzu nad 100 €.

Plán pre nepredvídané rastové scenáre

  • Viral moment (TV repotráž, ministerská návšteva): static web držia, aplikácie horizontálne škálujú, MongoDB potrebuje upgrade. Pripravený upgrade-runbook v operations/runbook-spike.md (TBD).
  • Mux je príliš drahý: migrácia na Cloudflare Stream — kompatibilná HLS, lacnejšia o 50–70% pri väčších objemoch. Migrácia ~2 týždne (re-upload videí, switch URLs).
  • MongoDB stagnuje: na čítanie štatistík v admin používame agregačné pipelines a cache do Redisu (TTL 5 min).