Thuật toán Ứng dụng — DP, String, Big Data & hơn nữa
~15 phútBig data & streaming — Khi RAM không đủAll-Access

Sliding window — thống kê trên cửa sổ trượt

Cửa sổ trượt cho dữ liệu chảy liên tục: monotonic deque cho max/min, và hai cách giới hạn request theo thời gian là sliding log và sliding window counter.

TL;DR: Khi dữ liệu chảy mãi không dừng, bạn không giữ được cả lịch sử, chỉ giữ được "khung nhìn" N phần tử hoặc T giây gần nhất. Cửa sổ theo số phần tử (N mẫu gần nhất) trả lời max/min bằng monotonic deque, một hàng đợi hai đầu luôn xếp giảm dần, trung bình O(1) mỗi mẫu. Cửa sổ theo thời gian (T giây gần nhất) là nền của rate limiter: sliding log giữ hàng đợi timestamp nên chính xác nhưng tốn bộ nhớ theo số request, còn sliding window counter chỉ giữ hai bộ đếm của hai cửa sổ cố định liền kề, tốn O(1) nhưng ước lượng bằng nội suy nên có sai số. Chọn loại nào là chọn món bạn chịu mất: bộ nhớ hoặc độ chính xác.

Một API gateway giới hạn mỗi user 100 request trong 60 giây gần nhất. Giữ timestamp từng request: 100 × 8 byte = 800 byte mỗi user, 10 triệu user ra khoảng 8 GB (chưa tính overhead). Giữ hai bộ đếm: 2 × 8 byte × 10 triệu = 160 MB. Chênh 50 lần, cái giá là một phép ước lượng. Bài này đi từ cửa sổ theo số phần tử sang cửa sổ theo thời gian để thấy đánh đổi đó nảy ra từ đâu.

1. Cửa sổ theo số phần tử hay theo thời gian?

Hình dung bạn ngồi trên tàu nhìn qua khung cửa: chỉ thấy các cảnh gần nhất, cảnh mới vào mép phải thì cảnh cũ trôi khỏi mép trái.

Ngồi trên tàuCửa sổ trượt
Khung cửaCửa sổ: N phần tử hoặc T giây gần nhất
Cảnh mới vào mép phảiPhần tử đến
Cảnh trôi khỏi mép tráiPhần tử hết hạn, bị loại
Cảnh nổi bật nhất trong khungMax/min hoặc số request trong khung

Khung này đo được theo số phần tử ("độ trễ lớn nhất trong 1.000 mẫu gần nhất", khung cố định) hoặc theo thời gian ("số request trong 60 giây gần nhất", số phần tử trong khung lúc nhiều lúc ít). Cả hai dựa trên deque (hàng đợi hai đầu, thêm và bớt ở cả hai đầu đều tức thì), xem bài queue và deque.

All-Access Pass

Phần còn lại của bài dành cho All-Access Pass

Bạn vừa đọc phần xem trước. Hai bài đầu của mỗi khoá luôn đọc trọn miễn phí.

  • Đọc trọn mọi bài trong 6 khoá System Design và dữ liệu phân tán
  • AI Mentor trả lời theo toàn bộ nội dung bài
  • Trả một lần, không tự gia hạn, không tự trừ tiền

Trọn đời

1.690.000 ₫

Trả một lần, dùng mãi mãi

Gói năm

699.000 ₫

365 ngày · ≈ 58.000 ₫/tháng

Thanh toán bằng thẻ Visa/Master/JCB qua Polar. Xem bảng giá

Đã mua? Đăng nhập để đọc tiếp

Bài này có giúp bạn hiểu bản chất không?

Bài này đáng gửi cho bạn học cùng?

Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.

Thảo luận & góp ý

Hỏi đáp về bài này

Bài tiếp theo

Mini-challenge — top-K phần tử trên stream