0

Hệ thống chạm ngưỡng 10M requests/ngày: Những "cú tát" khiến mình tỉnh ngộ về Backend

Ở scale nhỏ, mọi thứ đều màu hồng. Nhưng khi traffic bắt đầu nhảy số lên hàng triệu, những góc khuất tối nhất của hệ thống sẽ bắt đầu lộ ra và tát thằng vào mặt bạn

Đó là bài học đầu tiên mình học được khi hệ thống đạt ngưỡng 10 triệu requests mỗi ngày. Lúc đó, những kiến thức trong sách vở hay các bài tutorial "Hello World" về microservices bỗng trở nên xa xỉ. Thực tế phũ phàng hơn nhiều.

Dưới đây là những thứ mà mình - có lẽ là bắt kỳ backend dev nào - cũng sẽ phải tỉnh ngộ sau khi nến mùi scale lơn.

1. Cache Invalidation: Bài toán "xóa hay giữ" đầy đau khổ

Hồi xưa mình cứ nghĩ: "Chậm à? Cắm Redis vào là xong!". Nhưng ở scale lớn, Cache Invalidation (làm tươi cache) mới là thứ khiến bạn mất ngủ.

Khi bạn có 10 triệu request, việc dữ liệu trong cache bị lệnh so với database dù chỉ 1s cũng có thể dẫn đến những hệ lụy kinh khủng (ví dụ: số dư tài khoản, số lương hàng tồn kho).

  • Nếu dùng TTL (Time to live) quá ngắn, DB sẽ "ăn đòn" vì cache miss liên tục.
  • Nếu dùng TTL quá dài, dữ liệu bị sai lệnh
  • Nếu xóa cache ngay khi update database khi cache vừa bị xóa

Bài học: Đừng chỉ học cách đưa dữ liệu vào cache, hãy học cách kiểm soát vòng đời của nó một cách cực đoan.

2. Database Index quan trọng hơn mọi loại Code Optimization

Mình từng dành cả buổi sáng để tối ưu một vòng lặp từ O(n2)O(n^2) xuống O(n)O(n), nhưng kết quả là hệ thống vẫn chậm, Tại sao? vì một câu query thiếu index trên một table có vài trăm triệu record.

ở scale 10M requests/ngày, code của bạn có thể hơi "thô" một chút cũng được, nhưng index thì không được phép sai. Một lần "Full table Scan" lúc này không khác gì một cuộc tấn công từ cối dịch vụ (DDoS) tự thân vào hệ thống. Lúc này, bạn sẽ nhận ra việc hiểu sâu về B -Tree, Hash Index hay Composite Index còn đáng hơn cả việc thuộc lòng các Design Patterns phức tạp.

3. Tail Latency (P99) quan trọng hơn Average Latency

"Average Latency của chúng ta là 50ms, tuyệt vời!". Đừng vội mừng.

Con số trung bình là một "lời nói dối" ngọt ngào. Nếu 95% user cảm thấy nhanh, nhưng 5% còn lại (P95) hoặc 1% (P99) phải đợi tới 5 giây, thì với 10 triệu request, bạn đang làm cho 100.000 người dùng mỗi ngày cảm thấy cực kỳ khó chịu.

Những request chậm này thường là nguyên nhân gây nghẽn cổ chai (bottleneck), chiếm dụng tài nguyên và kéo sập cả những request nhanh khác. Khi làm hệ thống lớn, hãy nhìn vào biểu đồ P99, P99.9 thay vì chỉ nhìn vào con số trung bình vô nghĩa.

4. Queue Retry: Con dao hai lưỡi có thể "kết liễu" hệ thống

Chúng ta thường được dạy: "Nếu task thất bại, hãy đẩy vào Queue để retry". Nghe thì hợp lý, nhưng hãy cẩn thận với Thundering Herd Problem.

Khi một service hạ tầng (như DB hoặc một API bên thứ ba) gặp sự cố trong 5 phút, hàng triệu task sẽ thất bại. Nếu bạn cấu hình retry ngay lập tức hoặc không có chiến lược Exponential Backoff (thời gian retry giãn cách tăng dần), thì ngay khi service đó vừa sống lại, một "cơn lũ" retry từ Queue sẽ ập đến và đánh sập nó thêm một lần nữa.

Retry không kiểm soát chính là cách nhanh nhất để bạn tự DDoS chính mình.

5. Khả năng quan sát (Observability) là sống còn

Lúc hệ thống nhỏ, bạn có thể SSH vào server để đọc log. Lúc hệ thống 10M requests, đó là chuyện viễn tưởng.

Bạn không thể sửa những thứ bạn không nhìn thấy. Lúc này, việc thiết lập một hệ thống Monitoring/Tracing (như Prometheus, Grafana, Jaeger) không còn là "option" nữa mà là bắt buộc. Bạn cần biết chính xác request bị nghẽn ở đâu, service nào đang tăng vọt CPU trước khi khách hàng kịp phàn nàn.

Tạm kết

Chạm ngưỡng 10 triệu requests/ngày giống như việc bạn chuyển từ lái xe đạp sang lái một chiếc Boeing. Mọi sai lầm nhỏ nhất đều được phóng đại lên gấp hàng triệu lần.

Backend dev lúc này không chỉ là người viết code, mà là một người "điều phối tài nguyên" và "dự đoán rủi ro". Hy vọng những chia sẻ này giúp anh em có cái nhìn thực tế hơn về con đường scale hệ thống. Đừng đợi đến khi server "cháy" rồi mới đi học về Index hay Retry nhé!

Anh em có từng gặp cú tát nào khác khi làm hệ thống lớn không? Chia sẻ bên dưới để mình cùng thảo luận nhé!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí