Implementatie van het sliding-window-logalgoritme
Krijg inzicht in het sliding-window-logalgoritme, de nauwkeurigheid ervan en de gevolgen voor opslag bij het bijhouden van tijdstempels van afzonderlijke aanvragen.
Implementatie van het sliding-window-logalgoritme is een gratis Patronen voor API-snelheidsbeperking en schaalbaarheid-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Patronen voor API-snelheidsbeperking en schaalbaarheid. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Patronen voor API-snelheidsbeperking en schaalbaarheid bevat in totaal 4 lessen.
Introductie tot Sliding Window Log
Welkom bij het Sliding Window Log-algoritme! Deze methode biedt een zeer nauwkeurige manier om API-snelheidslimieten af te dwingen.
In tegenstelling tot eenvoudigere methoden houdt deze methode een gedetailleerd overzicht van elk verzoek bij, waardoor verkeer zeer nauwkeurig kan worden beheerd.
De kern van het tijdstempeloverzicht
Het kernidee van Sliding Window Log is het opslaan van het exacte tijdstip van elk verzoek dat een client doet.
- Stel je een lijst of array voor.
- Elke keer dat er een verzoek wordt gedaan, wordt het huidige tijdstip (bijvoorbeeld in milliseconden) aan deze lijst toegevoegd.
- Met dit overzicht kunnen we activiteit gedurende elke gewenste periode nauwkeurig volgen.
Nieuwe verzoeken registreren
Wanneer er een nieuw verzoek binnenkomt, voert het algoritme twee belangrijke stappen uit:
- Het registreert het huidige tijdstip en voegt dit toe aan de lijst met tijdstippen van verzoeken.
- Daarna ruimt het oude tijdstippen op die niet langer relevant zijn voor het huidige 'schuivende' venster.
Zo bevat het overzicht alleen recente, actieve verzoeken.
Het schuivende venster controleren
Om te bepalen of een nieuw verzoek mag worden toegestaan, berekent het algoritme een schuivend venster.
- Bij een limiet van 60 seconden geldt: als het huidige tijdstip
Tis, loopt het venster vanT - 60 secondstotT. - Het telt hoeveel tijdstippen in het overzicht binnen dit berekende venster vallen.
- Als het aantal onder de toegestane limiet ligt, wordt het verzoek toegestaan.
De beweging van het venster visualiseren
Zie het venster als een voortdurende periode die bij elk nieuw verzoek vooruit 'schuift'.
Als je limiet 3 verzoeken per 5 seconden is:
- Op
t=0is het venster[-5s, 0s]. - Op
t=2sis het venster[-3s, 2s]. - Op
t=6sis het venster[1s, 6s].
Alleen tijdstippen binnen het huidige schuivende venster worden meegeteld.
De klasse van de snelheidsbeperker instellen
Laten we een eenvoudige Java-klasse instellen voor onze snelheidsbeperker op basis van Sliding Window Log. We gebruiken een ArrayList om de tijdstippen van verzoeken op te slaan.
Voer dit uit om de eerste instellingen te bekijken:
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!");
}
}allowRequest() implementeren
Laten we nu de kernlogica voor de methode allowRequest() implementeren. Deze methode verwijdert oude tijdstippen en controleert of het huidige verzoek mag worden toegestaan.
Voer de code uit om een eenvoudige test van de snelheidsbeperker in actie te zien!
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"));
}
}Belangrijk voordeel: hoge precisie
De grootste kracht van het Sliding Window Log-algoritme is de hoge precisie.
- Omdat het elk afzonderlijk tijdstip registreert, kan het nauwkeurig berekenen hoeveel verzoeken binnen elk dynamisch venster vallen.
- Hierdoor verdwijnt het probleem van 'pieken' dat je bij Fixed Window Counters ziet, waarbij een plotselinge piek aan de rand van het venster de limieten kon omzeilen.
De uitdaging van geheugen en prestaties
Hoewel Sliding Window Log nauwkeurig is, heeft het aanzienlijke nadelen, vooral voor API's met veel verkeer:
- Geheugengebruik: het opslaan van elk tijdstip voor miljoenen verzoeken kan veel geheugen gebruiken.
- Prestaties: bewerkingen zoals het toevoegen van nieuwe tijdstippen en het verwijderen van oude tijdstippen (vooral bij grote lijsten) kunnen traag worden en de prestaties beïnvloeden.
Daardoor is deze methode minder geschikt voor systemen met een extreem hoge doorvoersnelheid, tenzij ze wordt geoptimaliseerd.
Controleer je begrip
Bekijk het Sliding Window Log-algoritme. Welke van de volgende uitspraken over de eigenschappen ervan zijn waar?
Samenvatting: Sliding Window Log
In deze les hebben we het Sliding Window Log-algoritme verkend:
- Het houdt elk verzoek bij aan de hand van het exacte tijdstip.
- Het biedt hoge precisie en voorkomt het probleem van 'pieken' bij vaste vensters.
- De belangrijkste nadelen zijn hoog geheugengebruik en mogelijke prestatieknelpunten bij zeer grote overzichten van verzoeken.
Hierna bekijken we de Sliding Window Counter, die deze nadelen probeert te verminderen!
Leer Patronen voor API-snelheidsbeperking en schaalbaarheid met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 12
- Lessen
- 48
Veelgestelde vragen
Is de les “Implementatie van het sliding-window-logalgoritme” gratis?
Ja — de volledige tekst van “Implementatie van het sliding-window-logalgoritme” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Patronen voor API-snelheidsbeperking en schaalbaarheid wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Patronen voor API-snelheidsbeperking en schaalbaarheid bevat in totaal 4 lessen.
Wat leer ik in “Implementatie van het sliding-window-logalgoritme”?
Krijg inzicht in het sliding-window-logalgoritme, de nauwkeurigheid ervan en de gevolgen voor opslag bij het bijhouden van tijdstempels van afzonderlijke aanvragen. Je oefent met Patronen voor API-snelheidsbeperking en schaalbaarheid door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Patronen voor API-snelheidsbeperking en schaalbaarheid te beginnen?
Ervaring vooraf is niet nodig. Patronen voor API-snelheidsbeperking en schaalbaarheid op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.
Hoe lang duurt de les “Implementatie van het sliding-window-logalgoritme”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Patronen voor API-snelheidsbeperking en schaalbaarheid?
Ja. Elke les over Patronen voor API-snelheidsbeperking en schaalbaarheid bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Implementatie van het sliding-window-logalgoritme
- Strategie voor de sliding-window-counter
- Vergelijking van algoritmen en afwegingen
- Sliding window met sorted sets in Redis