पाठ 23 / 25
Case Study: Scaling a Web App Step by Step
Follow a typical growth path and the change that each stage requires.
Grow the architecture with the traffic
Systems rarely need their final architecture on day one. A common path: Stage 1, one server running the app and database; fine for a prototype. Stage 2, move the database to its own managed instance with backups and point-in-time recovery; add monitoring. Stage 3, put a load balancer in front of two or more stateless app instances across zones; sessions move to Redis; static files move to object storage and a CDN. Stage 4, add an application cache and database read replicas for read-heavy pages; move slow work to queues and workers. Stage 5, introduce SLOs, autoscaling, canary deployments and on-call. Stage 6, as write volume or data size outgrows one primary, partition data or split specific domains into separate services with their own stores. Stage 7, multi-region only if users or availability targets require it. At every stage, measure first and fix the current bottleneck rather than the imagined one.
Bottleneck-driven growth
Each change is triggered by a measured symptom.
symptom change
--------------------------------------------- --------------------------------------------
app and DB fight for CPU on one box separate managed database
one app server at 80% CPU, no redundancy LB + 2-3 stateless instances across zones
same product pages read 1000x per minute cache + CDN; read replicas
uploads and emails slow down requests queue + workers
releases cause outages canaries, feature flags, SLO alerts
single primary saturated on writes partition by customer / split a domain
users on another continent see 300 ms+ RTT edge caching first, then a second regionExtending a house
You add a room when the family grows, not before you are married. But you lay foundations strong enough for a second floor (stateless app servers, backups, monitoring) from the start, because they are hard to add later.
त्वरित जाँच: Product pages are read thousands of times per minute and the primary database is busy. What is usually the first step?
- Shard the database by product ID
- Add caching (and a CDN) and serve reads from replicas
- Move to multi-region active-active
- Rewrite the app in another language
Answer
Add caching (and a CDN) and serve reads from replicas — Read-heavy load is cheapest to address with caching and read replicas before partitioning.