
Không có đội ngũ lớn, không có ngân sách khổng lồ. Chỉ có kỷ luật kỹ thuật — và một hệ thống được xây để trông đợi traffic, không phải chịu đựng traffic.
Backend là monolith Spring Boot trên 1 EC2. Mọi thứ ổn cho đến khi một bài Reddit đổ 5.000 request đồng thời — hệ thống sập hoàn toàn.
Bài học rút ra: “Scalability bắt đầu từ nơi bạn ngừng giả định.”
Tách monolith thành microservices, đóng gói bằng Docker. Mỗi service sống độc lập — service kia chết, service này vẫn chạy.
Stack: Spring Boot + React + PostgreSQL + Redis + Kafka + Kubernetes (AWS EKS).
REST đồng bộ gây cascading failure. Chuyển sang event-driven với Kafka (user_created, feed_published…). Throughput tăng 40%, latency xuống dưới 100ms.
PostgreSQL sharded theo user_id % 3 + read replicas + Redis cache → query từ 2–3 giây còn dưới 50ms.
Deploy theo kiểu canary: roll ra 5% pod → quan sát Prometheus → scale dần → auto-rollback nếu có anomaly. Tần suất deploy từ 1 lần/tuần lên 3–4 lần/ngày.
Monitoring stack: Prometheus + Grafana + ELK + Jaeger.
Không outage. Không database panic. Không ai phải ôm laptop lúc 3 giờ sáng.
Vì hệ thống không được xây để chịu đựng traffic — nó được xây để trông đợi traffic.
Dùng Terraform từ ngày 1, triển khai Jaeger tracing sớm hơn, và định nghĩa bounded context cho microservices ngay từ đầu — vì tách một service lớn thành hai cái nhỏ luôn đau hơn nhiều so với merge hai cái nhỏ lại.
Zero downtime không phải là may mắn. Đó là kết quả của việc thiết kế cho thất bại, tự động hóa niềm tin, và đo đạc mọi thứ.