Tình huống: cache stampede giờ cao điểm Trung cấp
Thời gian đọc ước tính: 1 phút
Một hot key, một tối livestream sale, bốn quyết định. Bạn sẽ cầm máu database đang quá tải, sửa tận gốc, rồi gặp hai lỗi cache-aside không để lại dòng log nào.
- Trước khi chọn, ước lượng nhanh:
request rate × thời gian nạplà số request cùng miss. - Chọn sai thì đọc giải thích rồi Chọn lại. Điểm chỉ tính lựa chọn đầu tiên ở mỗi bước.
Livestream sale: trang chủ làm sập database mỗi 5 phút
Bạn là backend dev phụ trách trang chủ: 20 instance, mỗi instance pool 10 connection PostgreSQL, cache Redis theo kiểu cache-aside. Mỗi lựa chọn hiển thị ngay hậu quả trên các chỉ số bên dưới.
CPU PostgreSQL97 %
p99 trang chủ4.200 ms
Query trang chủ chạy song song200
Giá cũ còn hiển thị0 phút
Bước 1/4 · DB quá tải, ngay bây giờ
20:00, livestream sale, trang chủ nhận 4.000 request/s. Key home:products có TTL cố định 300 giây; query nạp nó mất 0,8 giây lúc bình thường. Cứ 5 phút CPU database lại vọt lên, và lần này không hạ xuống.
- connection PostgreSQL
- 200/200 (20 × pool 10)
- pg_stat_activity
- 200 dòng cùng TOP_PRODUCTS_SQL
- expired_keys
- đột biến đúng mỗi 5 phút
async function getHomeProducts() {
const hit = await redis.get('home:products');
if (hit) return JSON.parse(hit);
const rows = await db.query(TOP_PRODUCTS_SQL); // 0,8 s, giờ là 3 s
await redis.set('home:products', JSON.stringify(rows), 'EX', 300);
return rows;
}Bạn làm gì?
Chơi xong, đọc Cache stampede để so sánh lock có token, singleflight, XFetch và stale-while-revalidate.