スライディングウィンドウログの実装
スライディングウィンドウログアルゴリズムの精度と、個々のリクエストのタイムスタンプを追跡するために必要なストレージについて理解します。
「スライディングウィンドウログの実装」はCoddyKit上の無料API Rate Limiting & Scalability Patternsレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAPI Rate Limiting & Scalability Patterns学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 API Rate Limiting & Scalability Patternsコースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
Intro to Sliding Window Log
Welcome to the Sliding Window Log algorithm! This method offers a highly precise way to enforce API rate limits.
Unlike simpler methods, it keeps a detailed record of each request, allowing for very accurate control over traffic.
The Timestamp Log Core
The core idea of the Sliding Window Log is to store the exact timestamp of every request made by a client.
- Imagine a list or array.
- Each time a request is made, its current time (e.g., in milliseconds) is added to this list.
- This log allows us to precisely track activity over any given period.
Logging New Requests
When a new request arrives, the algorithm performs two main steps:
- It records the current time and adds it to the list of request timestamps.
- It then cleans up old timestamps that are no longer relevant to the current 'sliding' window.
This ensures the log only contains recent, active requests.
Checking the Sliding Window
To determine if a new request should be allowed, the algorithm calculates a sliding window.
- For a 60-second limit, if the current time is
T, the window covers requests fromT - 60 secondstoT. - It counts how many timestamps in the log fall within this calculated window.
- If the count is below the allowed limit, the request is permitted.
Visualizing Window Movement
Think of the window as a continuous period that 'slides' forward with each new request.
If your limit is 3 requests per 5 seconds:
- At
t=0, window is[-5s, 0s]. - At
t=2s, window is[-3s, 2s]. - At
t=6s, window is[1s, 6s].
Only timestamps within the current sliding window are counted.
Limiter Class Setup
Let's set up a basic Java class for our Sliding Window Log rate limiter. We'll use an ArrayList to store the request timestamps.
Try running this to see the initial setup:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class SlidingWindowLogRateLimiter {
private final List<Long> requestTimestamps;
private final long windowSizeMillis; // e.g., 60_000 for 60 seconds
private final int maxRequests;
public SlidingWindowLogRateLimiter(long windowSize, TimeUnit unit, int maxRequests) {
this.requestTimestamps = new ArrayList<>();
this.windowSizeMillis = unit.toMillis(windowSize);
this.maxRequests = maxRequests;
}
// The allowRequest() method will be added next!
public static void main(String[] args) {
System.out.println("Rate Limiter setup complete!");
}
}Implementing allowRequest()
Now, let's implement the core logic for the allowRequest() method. This method will remove old timestamps and check if the current request can be allowed.
Run the code to see a simple test of the rate limiter in action!
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class SlidingWindowLogRateLimiter {
private final List<Long> requestTimestamps;
private final long windowSizeMillis;
private final int maxRequests;
public SlidingWindowLogRateLimiter(long windowSize, TimeUnit unit, int maxRequests) {
this.requestTimestamps = new ArrayList<>();
this.windowSizeMillis = unit.toMillis(windowSize);
this.maxRequests = maxRequests;
}
public synchronized boolean allowRequest() {
long currentTime = System.currentTimeMillis();
long windowStartTime = currentTime - windowSizeMillis;
// Remove timestamps older than the current window
requestTimestamps.removeIf(timestamp -> timestamp <= windowStartTime);
// Check if adding a new request would exceed the limit
if (requestTimestamps.size() < maxRequests) {
requestTimestamps.add(currentTime);
return true;
}
return false;
}
public static void main(String[] args) throws InterruptedException {
// Example: 3 requests allowed per 5 seconds
SlidingWindowLogRateLimiter limiter =
new SlidingWindowLogRateLimiter(5, TimeUnit.SECONDS, 3);
System.out.println("Testing 5s, 3 requests limit:");
for (int i = 0; i < 5; i++) {
boolean allowed = limiter.allowRequest();
System.out.println("Request " + (i + 1) + ": " + (allowed ? "Allowed" : "Blocked"));
if (i == 2) Thread.sleep(1000); // Small delay to simulate real traffic
}
// Wait for the window to pass to allow more requests
System.out.println("Waiting 5 seconds for window reset...");
Thread.sleep(5000);
System.out.println("Request after window reset: " + (limiter.allowRequest() ? "Allowed" : "Blocked"));
}
}Key Advantage: High Precision
The biggest strength of the Sliding Window Log algorithm is its high precision.
- Because it records every individual timestamp, it can accurately calculate the number of requests within any dynamic window.
- This eliminates the 'burstiness' problem seen in Fixed Window Counters, where a sudden spike at the window's edge could bypass limits.
The Memory & Performance Challenge
While precise, the Sliding Window Log has significant drawbacks, especially for high-volume APIs:
- Memory Usage: Storing every timestamp for millions of requests can consume a lot of memory.
- Performance: Operations like adding new timestamps and removing old ones (especially with large lists) can become slow, impacting performance.
This makes it less suitable for extremely high-throughput systems unless optimized.
Check Your Understanding
Consider the Sliding Window Log algorithm. Which of the following statements are true about its characteristics?
Recap: Sliding Window Log
In this lesson, we explored the Sliding Window Log algorithm:
- It tracks every request by its exact timestamp.
- It offers high precision, avoiding the 'burst' issue of fixed windows.
- Its main drawbacks are high memory usage and potential performance bottlenecks for very large request logs.
Next, we'll look at the Sliding Window Counter, which aims to improve on these drawbacks!
よくある質問
「スライディングウィンドウログの実装」レッスンは無料ですか?
はい。「スライディングウィンドウログの実装」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、API Rate Limiting & Scalability Patternsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 API Rate Limiting & Scalability Patternsコースには全4レッスンが含まれています。
「スライディングウィンドウログの実装」で何を学びますか?
スライディングウィンドウログアルゴリズムの精度と、個々のリクエストのタイムスタンプを追跡するために必要なストレージについて理解します。 ブラウザで直接実行するハンズオンコードでAPI Rate Limiting & Scalability Patternsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
API Rate Limiting & Scalability Patternsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAPI Rate Limiting & Scalability Patternsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「スライディングウィンドウログの実装」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAPI Rate Limiting & Scalability Patternsレッスンでコードを書いて実行できますか?
はい。すべてのAPI Rate Limiting & Scalability Patternsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- スライディングウィンドウログの実装
- スライディングウィンドウカウンター戦略
- アルゴリズムの比較とトレードオフ
- Redisのソート済みセットによるスライディングウィンドウ