Case study tech stack này kể câu chuyện một startup SaaS tại TP.HCM — từ lúc chi 45 triệu/tháng cho infrastructure phục vụ 2,000 users (quá đắt!) đến khi tái cấu trúc tech stack, giảm còn 18 triệu/tháng và tăng tốc phát triển feature gấp 3 lần.
Bối cảnh
Về startup
- Sản phẩm: SaaS quản lý nhân sự cho SME
- Năm thành lập: 2024
- Team: 4 developers, 1 designer, CEO
- Users: 2,000 (50 công ty khách hàng)
- MRR: 80 triệu VND/tháng
- Vấn đề: Chi phí infrastructure quá cao, phát triển feature quá chậm
Tech stack ban đầu (over-engineered)
CTO ban đầu (đã nghỉ) thiết kế kiến trúc “enterprise-grade”:
| Thành phần | Công nghệ | Chi phí/tháng |
|---|---|---|
| Frontend | React + Redux + Storybook | - |
| Backend | 5 microservices (Node.js) | - |
| API Gateway | Kong | $30 |
| Database | PostgreSQL (RDS r5.large) | $200 |
| Cache | Redis (ElastiCache) | $70 |
| Message Queue | RabbitMQ (EC2) | $80 |
| Search | Elasticsearch (EC2) | $150 |
| Monitoring | Datadog (5 hosts) | $150 |
| CI/CD | Jenkins (EC2) | $50 |
| Container orchestration | Kubernetes (EKS) | $150 |
| Logs | ELK Stack | $100 |
| CDN | CloudFront | $20 |
| Misc (NAT, ALB, etc.) | AWS | $100 |
| Tổng infrastructure | ~$1,100/tháng (~28 triệu VND) | |
| DevOps engineer (part-time) | 17 triệu VND/tháng | |
| Tổng chi phí | ~45 triệu VND/tháng |
Vấn đề cụ thể
1. Over-engineering cho quy mô hiện tại:
- Kubernetes cho 5 microservices phục vụ 2,000 users — như dùng xe tải 40 tấn chở 1 kiện hàng
- Elasticsearch cho search 50 công ty — đắt hơn so với PostgreSQL full-text search 100x
- Message queue cho flow đơn giản không cần async processing
2. Tốc độ phát triển chậm:
- 5 microservices = deploy 5 lần, test 5 lần, debug across 5 services
- Mỗi feature mới: 60% thời gian setup infrastructure, 40% viết logic
- DevOps bottleneck: 1 người quản lý Kubernetes, mọi thứ đi qua anh ta
3. Onboarding nightmare:
- Dev mới mất 6 tuần hiểu architecture
- Setup local development environment mất 2 ngày
- Documentation hầu như không có
Đánh giá Tech Stack
Phân tích “cần vs có”
| Feature | Cần (2,000 users) | Đang có |
|---|---|---|
| Compute | 2 small servers | 5 microservices + K8s |
| Database | PostgreSQL nhỏ | PostgreSQL lớn + Redis + Elasticsearch |
| Message Queue | Không cần | RabbitMQ |
| Monitoring | Basic (free tier) | Datadog enterprise ($150/tháng) |
| CI/CD | GitHub Actions (free) | Jenkins (tự host, cần maintain) |
| Container | Docker Compose đủ | Kubernetes (quá phức tạp) |
| Search | PostgreSQL LIKE/FTS | Elasticsearch |
| API Gateway | Nginx đủ | Kong (overkill) |
Kết luận assessment
Hệ thống được thiết kế cho 100,000 users nhưng chỉ phục vụ 2,000 users. Chi phí infrastructure chiếm 56% MRR — quá cao (nên < 15%).
Giải pháp: Simplify
Tech stack mới
| Thành phần | Cũ | Mới |
|---|---|---|
| Architecture | 5 Microservices | 1 Monolith (modular) |
| Orchestration | Kubernetes | Docker Compose |
| Compute | EKS + 5 EC2 | 1 EC2 t3.medium |
| Database | RDS r5.large | RDS t3.small |
| Cache | ElastiCache Redis | In-memory cache (Node.js) |
| Search | Elasticsearch | PostgreSQL Full-Text Search |
| Queue | RabbitMQ | Bull (Redis-based, chạy cùng app) |
| Monitoring | Datadog | CloudWatch + Sentry (free tier) |
| CI/CD | Jenkins | GitHub Actions (free) |
| API Gateway | Kong | Nginx (built-in) |
| Logs | ELK Stack | CloudWatch Logs |
Chi phí mới
| Hạng mục | Chi phí/tháng |
|---|---|
| EC2 t3.medium (reserved 1 year) | $20 |
| RDS t3.small (reserved) | $30 |
| S3 + CloudFront | $15 |
| CloudWatch | $10 |
| Sentry (free tier) | $0 |
| GitHub Actions | $0 |
| Misc | $10 |
| Tổng infrastructure | ~$85/tháng (~2.1 triệu VND) |
| DevOps (không cần riêng nữa) | 0 |
| Tổng | ~2.1 triệu VND/tháng |
Giảm từ 45 triệu → 2.1 triệu/tháng = giảm 95%.
Quy trình migration (4 tuần)
Tuần 1: Merge microservices → monolith
- Gộp 5 microservices thành 1 monolith modular (vẫn tách code theo module, nhưng deploy 1 app)
- Giữ API interface y nguyên → frontend không thay đổi
- Xóa inter-service communication (HTTP calls giữa services → function calls trong cùng app)
Tuần 2: Simplify infrastructure
- Xóa Kubernetes, chuyển sang Docker Compose
- Replace Elasticsearch → PostgreSQL FTS
- Replace RabbitMQ → Bull queue
- Replace Kong → Nginx
Tuần 3: Migrate data + testing
- Migrate database sang instance nhỏ hơn
- Full regression testing
- Performance testing (đảm bảo không giảm performance)
- Stress test 10x current load
Tuần 4: Cutover + monitoring
- Switch DNS
- Monitor intensively 1 tuần
- Decommission old infrastructure
- Update documentation
Kết quả
So sánh trước - sau
| Metric | Trước | Sau | Cải thiện |
|---|---|---|---|
| Chi phí infrastructure/tháng | 45 triệu | 2.1 triệu | -95% |
| Infrastructure/MRR ratio | 56% | 2.6% | Healthy |
| Thời gian deploy | 25 phút | 3 phút | -88% |
| Feature delivery/sprint | 2-3 | 7-8 | +180% |
| Onboarding dev mới | 6 tuần | 1 tuần | -83% |
| Local dev setup | 2 ngày | 30 phút | -97% |
| Thời gian debug | Trung bình 4 giờ | 30 phút | -87% |
Tài chính 12 tháng
| Hạng mục | Cũ (12 tháng) | Mới (12 tháng) |
|---|---|---|
| Infrastructure | 540 triệu | 25 triệu |
| DevOps engineer | 204 triệu | 0 |
| Tổng tiết kiệm | 719 triệu VND/năm |
Tốc độ phát triển
Sau khi simplify, team ship features nhanh gấp 3:
- Tháng 1 sau migration: 8 features (trước: 3)
- Tháng 2: 10 features + 1 major release
- Tháng 3: Tích hợp payroll module — trước đây estimate 3 tháng, xong trong 3 tuần
MRR tăng 40% trong 3 tháng nhờ ship features nhanh hơn.
Bài học rút ra
1. Start simple, scale later
Microservices, Kubernetes, Elasticsearch — tuyệt vời cho Netflix, Google. Nhưng startup 2,000 users không phải Netflix. Monolith đơn giản là lựa chọn đúng cho 95% startups dưới 50,000 users.
2. Infrastructure cost nên < 15% MRR
Nếu chi phí infrastructure > 15% Monthly Recurring Revenue → đang over-spending. Startup giai đoạn đầu nên target 5-10%.
3. Đừng thuê “tech stack theo CV”
CTO ban đầu chọn Kubernetes, microservices, ELK Stack — vì muốn CV đẹp, không phải vì sản phẩm cần. Hỏi: “Tại sao chọn tech này?” — nếu câu trả lời không liên quan đến business requirement → red flag.
4. Đo trước, tối ưu sau
Đừng tối ưu performance khi chưa có vấn đề. 2,000 users trên 1 server $20/tháng chạy ngon lành. Tối ưu khi thực sự gặp bottleneck, không phải tối ưu vì “sợ một ngày nào đó.”
5. Simplicity = Velocity
Ít tools hơn = ít thứ phải maintain = nhanh hơn. Team 4 devs nên focus 100% vào business logic, không phải 60% cho infrastructure.
Khi nào CẦN microservices?
Simplify không có nghĩa microservices là xấu. Chuyển sang microservices khi:
| Dấu hiệu | Ngưỡng |
|---|---|
| Team size | > 15 developers |
| Codebase | > 200K lines of code |
| Deploy frequency | Cần deploy các module độc lập |
| Users | > 50,000 concurrent |
| Organizational | Nhiều team làm cùng 1 codebase gây conflict |
Trước ngưỡng đó → Monolith modular là lựa chọn tối ưu.
Trinh Digital Tech Stack Services
Tại Trinh Digital, chúng tôi giúp startup và SME:
- Tech Stack Assessment — Đánh giá stack hiện tại, tìm over-engineering
- Simplification — Tối ưu infrastructure, giảm chi phí
- Migration — Chuyển đổi tech stack an toàn
- Architecture Design — Thiết kế “right-sized” cho quy mô hiện tại + growth plan
FAQ — Câu hỏi thường gặp
1. Simplify xong, khi scale up thì sao?
Kế hoạch scale: 2K → 20K users: upgrade instance size (vertical scaling). 20K → 200K users: thêm read replicas + caching. > 200K users: bắt đầu tách service dần (strangler pattern). Mỗi bước chỉ mất 1-2 tuần.
2. Chi phí migration có đáng không?
Trong case study này: chi phí migration 80 triệu (4 tuần × 4 devs). Tiết kiệm 719 triệu/năm. ROI tháng đầu tiên: 800%. Rất đáng.
3. CTO mới sẽ muốn thay đổi tech stack, có nên?
Đừng cho phép thay đổi tech stack vì preference cá nhân. Yêu cầu business justification: giải quyết vấn đề gì? ROI bao nhiêu? Rủi ro migration? Nếu chỉ vì “Go nhanh hơn Node” mà chưa gặp performance issue → giữ nguyên.
Chi phí infrastructure đang cao bất thường? Liên hệ Trinh Digital để được đánh giá tech stack miễn phí và đề xuất tối ưu.