Aus öffentlichen Paketdaten erstellte Orientierung.
Ein reiner Dart-Paket, das entwickelt wurde, um effektive Rate-Limiting-Strategien für normale Funktionen zu implementieren. Es hilft, Systeme vor Überlastung zu schützen, indem es die Häufigkeit der Funktionsausführungen steuert, und ist daher ideal für die Verwaltung von API-Aufrufen, Suchanfragen und anderen hochfrequenten Operationen geeignet. Mit Fokus auf Einfachheit und Leistung entwickelt, unterstützt es verschiedene Rate-Limiting-Algorithmen und integriert sich nahtlos über mehrere Plattformen hinweg. Das Paket ist besonders nützlich in Szenarien, die eine Drosselung oder Burst-Steuerung ohne externe Abhängigkeiten erfordern.
Anwendungsfälle
Beschränkung von API-Anfragen
Eingabehäufigkeit bei Suche beschränken
Spam bei Benutzereingaben verhindern
Verwaltung von spikigen Workloads
Steuerung der Ausführung von Hintergrundaufgaben
Hauptmerkmale
Unterstützt mehrere Rate-Limiting-Strategien
Reine Dart-Implementierung
Plattformübergreifende Kompatibilität
Einfache Funktion umhüllen
Konfigurierbare Grenzen und Intervalle
Keine externen Abhängigkeiten
Geeignet für
Entwickler, die APIs mit Nutzungseinschränkungen erstellen
Apps, die Eingabedämpfung benötigen
Systeme, die eine Lastschutzfunktion erfordern
Echtzeit-Anwendungen mit hohem Anrufvolumen
Teams, die Flutter über mehrere Plattformen hinweg verwenden
Hinweise
Erfordert manuelle Integration mit asynchronen Funktionen
Beschränkt auf Funktions-Level-Ratenbegrenzung
Keine integrierte Persistenz für Status
Am besten geeignet für leichte, synchrone Anwendungsfälle
Möglicherweise ist zusätzliche Behandlung für komplexe Konkurrenzmuster erforderlich
Original-README
Originaler README-Schnappschuss aus dem verknüpften Quell-Repository. Aktuelle Inhalte finden Sie im Repository.
Rate limiting is a strategy for limiting an action. It puts a cap on how often someone can repeat an action within a certain timeframe. Using rate_limiter we made it easier than ever to apply these strategies on regular dart functions.
Add the following to your pubspec.yaml and replace [version] with the latest version:
dependencies:rate_limiter:^[version]
Strategies
Debounce
A debounced function will ignore all calls to it until the calls have stopped for a specified time period. Only then it will call the original function. For instance, if we specify the time as two seconds, and the debounced function is called 10 times with an interval of one second between each call, the function will not call the original function until two seconds after the last (tenth) call.
Usage
It's fairly simple to create debounced function with rate_limiter
Creating from scratch
final debouncedFunction = debounce((String value) {
print('Got value : $value');
return value;
}, constDuration(seconds: 2));
Converting an existing function into debounced function
StringregularFunction(String value) {
print('Got value : $value');
return value;
}
final debouncedFunction = regularFunction.debounced(
constDuration(seconds: 2),
);
Example
Often times, search boxes offer dropdowns that provide autocomplete options for the user’s current input. Sometimes the items suggested are fetched from the backend via API (for instance, on Google Maps). The autocomplete API gets called whenever the search query changes. Without debounce, an API call would be made for every letter you type, even if you’re typing very fast. Debouncing by one second will ensure that the autocomplete function does nothing until one second after the user is done typing.
To throttle a function means to ensure that the function is called at most once in a specified time period (for instance, once every 10 seconds). This means throttling will prevent a function from running if it has run “recently”. Throttling also ensures a function is run regularly at a fixed rate.
Usage
Creating throttled function is similar to debounce function
Creating from scratch
final throttledFunction = throttle((String value) {
print('Got value : $value');
return value;
}, constDuration(seconds: 2));
Converting an existing function into throttled function
StringregularFunction(String value) {
print('Got value : $value');
return value;
}
final throttledFunction = regularFunction.throttled(
constDuration(seconds: 2),
);
Example
In action games, the user often performs a key action by pushing a button (example: shooting, punching). But, as any gamer knows, users often press the buttons much more than is necessary, probably due to the excitement and intensity of the action. So the user might hit “Punch” 10 times in 5 seconds, but the game character can only throw one punch in one second. In such a situation, it makes sense to throttle the action. In this case, throttling the “Punch” action to one second would ignore the second button press each second.
final throttledPerformPunch = throttle(
() {
print('Performed one punch to the opponent');
},
constDuration(seconds: 1),
);
RaisedButton(
onPressed: (){
throttledPerformPunch();
}
child: Text('Punch')
);
BackOff
BackOff is a strategy that allows you to retry a function call multiple times with a delay between each call. It is useful when you want to retry a function call multiple times in case of failure.
Usage
Creating backoff function is similar to debounce and throttle function.
Creating from scratch
final response = backOff(
// Make a GET request
() => http.get('https://google.com').timeout(Duration(seconds: 5)),
maxAttempts: 5,
maxDelay: Duration(seconds: 5),
// Retry on SocketException or TimeoutException
retryIf: (e, _) => e isSocketException || e isTimeoutException,
);
Converting an existing function into backoff function
Future<String> regularFunction() async {
// Make a GET requestfinal response = await http.get('https://google.com').timeout(Duration(seconds: 5));
return response.body;
}
final response = regularFunction.backOff(
maxAttempts: 5,
maxDelay: Duration(seconds: 5),
// Retry on SocketException or TimeoutException
retryIf: (e, _) => e isSocketException || e isTimeoutException,
);
Example
While making a network request, it is possible that the request fails due to network issues. In such cases, it is useful to retry the request multiple times with a delay between each call. This is where backoff strategy comes in handy.
final response = backOff(
// Make a GET request
() => http.get('https://google.com').timeout(Duration(seconds: 5)),
maxAttempts: 5,
maxDelay: Duration(seconds: 5),
// Retry on SocketException or TimeoutException
retryIf: (e, _) => e isSocketException || e isTimeoutException,
);
Pending
Used to check if the there are functions still remaining to get invoked.
final pending = debouncedFunction.isPending;
final pending = throttledFunction.isPending;
Flush
Used to immediately invoke all the remaining delayed functions.
final result = debouncedFunction.flush();
final result = throttledFunction.flush();
Cancellation
Used to cancel all the remaining delayed functions.