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àu | Cửa sổ trượt |
|---|---|
| Khung cửa | Cửa sổ: N phần tử hoặc T giây gần nhất |
| Cảnh mới vào mép phải | Phần tử đến |
| Cảnh trôi khỏi mép trái | Phần tử hết hạn, bị loại |
| Cảnh nổi bật nhất trong khung | Max/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á
Count-Min Sketch — đếm tần suất xấp xỉ
Bài tiếpMini-challenge — top-K phần tử trên stream
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