Part 10 · System Design · 10.1.10

MVP, 10x evolution và complexity budget

Senior design không chỉ cần scale được. Một thiết kế tốt còn phải biết hoãn complexity, biết khi nào nên tiến hóa, và luôn có đường migration/rollback an toàn thay vì rewrite toàn bộ hệ thống.

Mental model: bắt đầu bằng kiến trúc nhỏ nhất đáp ứng requirement hiện tại → đo bottleneck thật → nâng cấp đúng component đang chạm giới hạn → kiểm chứng sau thay đổi. Complexity là một budget phải tiêu có chủ đích.

1. MVP baseline: ship được, quan sát được, ít moving parts

Baseline hợp lý thường là managed relational database, ứng dụng stateless, object storage/CDN cho file/static content, và chỉ thêm queue khi workload thực sự cần tách bất đồng bộ. Mục tiêu là giảm số thành phần phải vận hành để đội ngũ có thể ship nhanh, debug dễ và quan sát hệ thống rõ ràng.

Ngay từ MVP, đừng chỉ ghi “sẽ scale sau”. Hãy ghi các trigger nâng cấp có thể đo được: QPS/throughput, dung lượng storage, p99 latency, availability/SLO, mức độc lập giữa team/tenant, hoặc yêu cầu compliance. Trigger biến evolution từ cảm tính thành decision dựa trên evidence.

Thành phần MVPVì sao thường đủ lúc đầuTrigger cần xem xét nâng cấp
Managed relational DBTransaction, indexing, backup và vận hành cơ bản đã có sẵnWrite saturation, storage/IO limit, p99 query tăng, tenancy/compliance cần isolation
Stateless appDễ scale horizontal và deploy/rollbackCPU/memory saturation, cold-start/runtime limit, stateful workflow xuất hiện
Object storage + CDNTách binary/static traffic khỏi app/databaseEgress/caching policy, regional latency, lifecycle/compliance thay đổi
Queue khi thật cầnKhông thêm distributed semantics sớmRequest path quá dài, burst cần buffer, retry/background processing cần tách
Scope guarantee: baseline này không phải kiến trúc mặc định cho mọi hệ thống. Nếu requirement ban đầu đã có multi-region active-active, strict isolation, regulated data hoặc throughput rất cao, MVP phải phản ánh những constraint đó ngay từ đầu.

2. Evolution sequence: thay đổi theo bottleneck có evidence

Chuỗi tiến hóa gợi ý từ BK là: Measure bottleneck → vertical/right-size → index/query → cache/read replica → async workload → partition/archive → regionalization. Đây không phải checklist bắt buộc theo đúng thứ tự; mỗi bước chỉ nên xảy ra khi metric chứng minh nó xử lý bottleneck hiện tại, và mỗi thay đổi phải có kế hoạch migration cùng rollback.

BướcCâu hỏi trước khi làmEvidence nên cóRollback/Migration concern
1. MeasureComponent nào thực sự gây giới hạn?CPU, IO, queue age, cache hit, DB waits, p95/p99, saturationThiết lập baseline và success criterion trước thay đổi
2. Vertical / right-sizeCó thể giải quyết bằng cấu hình/capacity đơn giản hơn không?Utilization + headroom + cost curveDowntime, resize window, quota
3. Index / queryĐang mua thêm hardware để che query xấu?Query plan, scanned rows/bytes, lock/wait timeIndex build cost, write amplification
4. Cache / read replicaRead nào lặp lại? Staleness cho phép bao nhiêu?Read/write ratio, hit rate dự kiến, replica lagInvalidation, consistency, fallback khi cache/replica lỗi
5. Async workloadPhần nào không cần hoàn tất trong request?Request critical path, burst profile, retry rateIdempotency, DLQ/retry, user-visible state
6. Partition / archiveData/traffic có key tự nhiên để chia không?Hot keys, data growth, working-set sizeRebalancing, cross-partition query, dual-read/write
7. RegionalizationLatency/RPO/RTO có thực sự yêu cầu nhiều region?User geography, outage model, SLOReplication conflict, failover/failback, data sovereignty

Complexity budget

Mỗi cache, queue, replica, partition hoặc region mới đều tạo thêm state, failure mode, observability và on-call burden. Vì vậy “có thể scale” chưa đủ; cần trả lời thêm: complexity này đang mua được requirement nào, và metric nào cho thấy đáng trả giá?

3. Build vs buy: tính total cost, không chỉ bill hạ tầng

Managed service thường giảm toil và rút ngắn thời gian vận hành, nhưng có thể đi kèm chi phí cao hơn ở một số workload, service limits, lock-in và egress. Self-host tăng control nhưng chuyển chi phí sang expertise, capacity planning, patching, upgrade, backup, security và on-call. Vì vậy phải đánh giá total cost, không chỉ compute/storage.

Cost dimensionManaged serviceSelf-host
Compute / storage / networkGiá dịch vụ và tier có thể cao hơn nhưng dễ elasticityCó thể tối ưu sâu hơn nếu workload ổn định và đội ngũ có năng lực
EngineeringÍt code/automation cho undifferentiated operationsCần xây tooling, automation, upgrade path
Incident / on-callMột phần trách nhiệm nằm ở provider, nhưng app vẫn phải xử lý failureĐội ngũ sở hữu toàn bộ incident surface
Compliance / governanceCó certification/control sẵn nhưng phải map đúng shared responsibilityControl cao hơn nhưng evidence/audit do đội tự xây
Lock-in / exit costAPI, data model, egress và migration có thể tạo switching costÍt lock-in vendor hơn nhưng vẫn có lock-in vào stack/operations nội bộ
TCO tư duy:
Infrastructure + Network/Egress + Engineering time + Operations/On-call + Incident impact + Compliance/Governance + Migration/Exit cost
Research note: AWS Well-Architected xem cost optimization là quá trình refinement liên tục trong toàn lifecycle; tài liệu cũng nhấn mạnh cân bằng demand/supply, dùng buffer/throttle khi phù hợp và tối ưu theo thời gian. Đây là bổ sung production detail, không thay đổi decision rule của BK.

4. 10x constraint: “10x” phải chỉ rõ thứ gì tăng

Khi reviewer hỏi “nếu tăng 10x thì sao?”, câu trả lời tốt không phải “thêm microservices/sharding”. Hãy nêu component chạm limit đầu tiênmetric chứng minh. 10x reads khác hoàn toàn 10x writes, 10x data volume, 10x tenants hay 10x regions.

10x ở đâu?Pressure thường tăngEvolution targeted có thể cân nhắc
ReadsDB read CPU/IO, repeated queries, networkIndex/query tuning, cache, read replica
WritesLock/contention, WAL/log, storage IOPSBatching, async, data model change, partition khi có evidence
Data volumeWorking set, backup/restore, scan costLifecycle, archive, tiering, partition
TenantsNoisy neighbor, isolation, metadata/cardinalityQuota, sharding/isolation theo tenant tier
RegionsReplication, consistency, failover, complianceRegionalization với explicit data ownership và RPO/RTO
Không rewrite toàn hệ thống chỉ vì “10x”. Evolve đúng bottleneck. Nếu 10x read vẫn nằm trong headroom DB sau index tuning, việc thêm partitioning chỉ làm tăng migration risk và operational surface.

5. Design review: truy được requirement, state, capacity và cost

Checklist gốc của BK nên được dùng như gate trước khi chốt design:

Câu hỏi review thực chiến

Design review output nên có: current baseline, top bottleneck, growth assumption, first-limit component, next evolution step, migration/rollback, TCO impact và not-now list. Như vậy architecture trở thành một lộ trình có kiểm chứng thay vì sơ đồ tĩnh.

6. Mini exercise

Giả sử một API hiện có 2.000 read QPS, 200 write QPS, p99 140 ms và DB CPU 45%. Trong 12 tháng, product dự báo read tăng 10x nhưng write chỉ tăng 2x. Hãy trả lời:

  1. Metric nào cần đo thêm trước khi quyết định?
  2. Component nào có khả năng chạm limit đầu tiên?
  3. Bước evolution nhỏ nhất bạn thử trước là gì?
  4. Success criterion và rollback condition là gì?
  5. Bạn sẽ ghi gì vào “not now” list?

Mục tiêu bài tập: chứng minh bạn có thể chuyển từ “10x” mơ hồ sang một evolution decision có evidence, cost và rollback.

Tài liệu: AWS Well-Architected · Cost Optimization Pillar · Google Cloud · Cost Optimization · Google Cloud Well-Architected Framework