Spring Boot Limits API calls

OnDemand

Top Contributor
Hallo zusammen,

mit RestTemplate SpringBoot rufe ich eine API die max 2 Anfragen pro Minute zulässt zb. ein anderer Enpoint 60 mal pro Minute.

Aktuell handhabe ich es so, dass ich it @Retry auf die Fehlermeldung reagiere, find ich aber irgendwie unpraktisch da zu Abbrüchen kommt. Kann man von vornherein irgendwie die Limits einhalten ohne dass man erst reagiert wenn die API "Too many connections" zurück gibt?
 

OnDemand

Top Contributor
Hmm das will irgendwie nicht :
Java:
RateLimiter rateLimiterGetProducts = RateLimiter.create(1);
rateLimiterGetProducts.acquire(1);
//call API

die API lässt 60 Aufrufe pro min zu. Geht auch komischerweise ein paar Minuten, dann nicht mehr. Ich vermute, dass die API da einen Fehler hat
 

LimDul

Top Contributor
Kommt der Aufruf der API direkt hinter dem acquire? Oder wird da noch mehr Code gemacht? Ich würde den auch nicht auf 1 setzen, sondern knapp drüber (z.B. 1.1).

Den der RateLimiter limitiert ja nicht den Aufruf der API - sondern sagt "Die Codezeile kann einmal pro Sekunde durchlaufen werden". Bis dann wirklich der Request abgesendet und bei der API aufschlägt vergeht ja auch etwas Zeit, da muss ggf. eine TCP/IP Verbindung aufgebaut werden etc. - Das dauert nicht bei jedem Aufruf gleich lang, so dass es sein kann dass du mal 61 Aufrufe in innerhalb von 60 Sekunden hast, weil halt der erste der 61 Aufrufe 10ms gedauert hat, bis der den API-Call abgeschickt hat und die nächsten 60 haben nur 5ms Sekunden gedauert.
 

OnDemand

Top Contributor
Jupp der API Call kommt direkt nach dem .aquire()

Wir haben jetzt mal einen Test gemacht und die API 60 mal aufgerufen, dafür haben wir aber 2 Minuten gebraucht. Trotzdem kam die Meldung, dass das Limit erreicht wurde. Daher tippe ich mal drauf, dass die externe API falsch ist oder deren Doku nicht stimmt.
 

OnDemand

Top Contributor
Ein anderer API Endpoint sagt max 1 Aufrud pro 6 Minuten, wir kann ich das denn lösen?
RateLimiter rateLimiter= RateLimiter.create(1/360) ? (360 sek = 6 min)
 

mihe7

Top Contributor
Hmm das will irgendwie nicht :
Java:
RateLimiter rateLimiterGetProducts = RateLimiter.create(1);
rateLimiterGetProducts.acquire(1);
//call API

die API lässt 60 Aufrufe pro min zu. Geht auch komischerweise ein paar Minuten, dann nicht mehr. Ich vermute, dass die API da einen Fehler hat
Blöde Frage: Du erzeugst aber nicht zufällig bei jedem Aufruf einen neuen RateLimiter? :)
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn du Spring Boot nutzt, kannst du resilience4j ziemlich einfach nutzen.

Methode entsprechende annotieren, in den Properties das Limit für den jeweiligen Endpoint hinerlegen und fertig.
 

OnDemand

Top Contributor
Das klappt Mit dem Guava RateLimiter super. Für spätere Besucher die ein ähnliches Problem haben: wichtig ist wie @LimDul sagt, dass man keine Integer Division macht. Statt

Java:
private RateLimiter rateLimiterGetAuthToken = RateLimiter.create(1 / 360);
muss man
Java:
private RateLimiter rateLimiterGetAuthToken = RateLimiter.create(1.0 / 360.0);
 

OnDemand

Top Contributor
Bin hier noch auf was gestoßen, dass ich mir nicht erklären kann.

Ich hole mir einen Token und bekomme als Antwort folgendes:

Java:
{"token":"eyJ0e-Ei7X3Tgo","valid_until":1618067803}

Dann prüfe ich wie folgt, ob der token noch gültig ist:

Java:
public boolean isTokenExpired() {
     return !Instant.now().isBefore(tokenExpires);
}

Klappt auch. Wenn der Token dann ungültig ist hole ich einen neuen, bekomme aber 429 too many requests. Das kann ich mir so gar nicht erklären weil ich definitiv das Limit nicht überschreite.

Einen neuen token darf man nur 1 mal in 6 Minuten holen, der Token gilt dann für 20 Minuten. Die Zeiten in Klammern, ist die Zeit aus der Response in GMT (ich bin in CEST) kann es damit was zu tun haben? Aber die uhr tickt doch überall gleich schnell^^

1. Token holen: 17:15:03 (Token bekommen 15:15:03 GMT)
neuer token gültig bis 2021-04-10T15:35:03Z also 20 min

2. Token abgelaufen: 17:35:05
Hole neuen Token: und bekomme 429 mit Response Zeitpunkt 15:35:06 GMT
Im Header steht ausserdem: X-RateLimit-Remaining:"0", Retry-After:"50"

Könnte also in 50 sek nochmal versuchen. Versteh ich aber nicht weil ja die 6 min laange um sind.

Hat jemand ne Idee was da los sein könnte?

Wenn ich es lokal mit Postman mache, kann ich nach 6 min einen Token holen. Auf dem Server klappts nicht, daher meine Vermutung dass es an der Zeitzone liegt. Die hat doch aber damit nix zu tun oder?

Der Ratelimiter schlägt da auch nicht an, da die 6 Minuten ja um sind, logo.
 

OnDemand

Top Contributor
Ich lass mir bereits alles über einen Interceptor im Resttemplate loggen, sieht auch gut aus. hab auch gedacht, dass ich versehntlich 2 mal den Token anfordere aber ist nicht. Hab auch schon ein total profesionelles sysout rein gemacht beim Methodenaufruf, aber der kommt nur 2 mal (beim initalen anfragen und beim verlängern)
 

OnDemand

Top Contributor
im gesamten Log taucht der aufgerufene Endpoint wirklich nur 2 mal auf, doppelt ist da nix. Zeitlich auch ausserhalb der 6 Minuten.
Hab das Gefühl, dass die API da irgendwas komisches macht. Die Doku ist nämlich auch falsch (ursprüngliches Problem mit 60/minute ist nämlich 60/5minuten)

1618075672477.png
 

OnDemand

Top Contributor
Gibt es vielleicht irgendwas, dass ich mit der API mitsenden muss im Header wovon in der Doku nix steht?! Aber so limits werden doch anhand des Users ausgemacht, der die Anfrage sendet oder? Viellicht nehmen die die IP, mach nämlich kurz bevor der Token abläuft eine andere Anfrage an die API
 

OnDemand

Top Contributor
Ganz misteriös...
Wenn ich den Aufruf für den Token zb per CURL direkt 2 x hintereinander mache:

lokal: sagt die API retry in 360 sek
auf dem Server: sagt die API retry in 20 min

Was zum kukuk ist das für ein Murks. Da kann doch nur die API abhängig zur IP, andere Limits vorgeben. Wobei meine lokale IP da nicht irgendwie bekannt ist sodass die da andere Limits hinterlegt hätten
 

OnDemand

Top Contributor
Problem war SSL falls es jemanden interessiert. Bei einem Endpoint hat es mit https andere Limits als ohne SSL.
Warum macht man das? Brauch der "Handshake" so viel mehr Rechenleistung, sodass man die Rate Limits erhöhen muss?
 

Flown

Administrator
Mitarbeiter
Weil die meisten Cloud-Dienste nach CPU/Service Zeit den Preis verrechnen. Nachdem SSL Rechenaufwand bedeutet -> weniger API calls.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Spring Boot Test Assertions mit Objekten Frameworks - Spring, Play, Blade, Vaadin & Co 6
8u3631984 Pfad zu Test Datei in application.yml in Spring Boot Test Frameworks - Spring, Play, Blade, Vaadin & Co 7
R Spring Boot sql Beziehungen Frameworks - Spring, Play, Blade, Vaadin & Co 12
M Spring Boot 3 Datenbanken zur Laufzeit Verbinden Frameworks - Spring, Play, Blade, Vaadin & Co 5
ExceptionOfExpectation In Meiner Spring-Boot Applikation verlangt die Datenbank Wert für eine ID Frameworks - Spring, Play, Blade, Vaadin & Co 5
H Spring Boot Applikation und JHM Benchmark sowie ContextConfiguration in H2 Tests ich bekomme es nicht hin Frameworks - Spring, Play, Blade, Vaadin & Co 2
ExceptionOfExpectation Tests in Spring-Boot Frameworks - Spring, Play, Blade, Vaadin & Co 4
Avalon Get Request doppelt abfeuern ohne Post Redirect Get Pattern. Spring Boot Thymeleaf MVC Frameworks - Spring, Play, Blade, Vaadin & Co 12
thor_norsk Konfigurationsprobleme mit Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 9
R Spring Boot Integration-testing mit Keycloak Frameworks - Spring, Play, Blade, Vaadin & Co 1
R Spring Boot Integration-testing mit Keycloak Frameworks - Spring, Play, Blade, Vaadin & Co 13
thor_norsk Spring Boot Fehler Frameworks - Spring, Play, Blade, Vaadin & Co 1
thor_norsk Spring Boot und Docker Frameworks - Spring, Play, Blade, Vaadin & Co 5
D Spring Boot Test ob Validation geprüft wurde Frameworks - Spring, Play, Blade, Vaadin & Co 8
K Spring Boot OneToMany Frameworks - Spring, Play, Blade, Vaadin & Co 6
8u3631984 Spring Boot Docker Image erstellen und mit docker-compose konfigurieren Frameworks - Spring, Play, Blade, Vaadin & Co 1
gradlew.bat spring-boot:run funktioniert nicht Frameworks - Spring, Play, Blade, Vaadin & Co 4
Zrebna Spring Boot/Thymeleaf: Bestätigungsemail senden. Frameworks - Spring, Play, Blade, Vaadin & Co 2
B Spring Boot und JPA Error creating bean Frameworks - Spring, Play, Blade, Vaadin & Co 24
R Spring Boot: Warum soll PasswordEncoder in einer neuen Methode definiert sein? Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Spring Boot und Microservices Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Spring Boot additional Datasource for a single entity Frameworks - Spring, Play, Blade, Vaadin & Co 0
Avalon Wie sieht bei Euch das Deployment einer Spring Boot Anwendung aus? Frameworks - Spring, Play, Blade, Vaadin & Co 4
M Threads in Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 7
W DI-Problem in Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 4
T Spring Boot: Was bewirkt parent in maven genau? Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Vaadin+Spring Boot erster Seitenload nach Neustart endlos Frameworks - Spring, Play, Blade, Vaadin & Co 0
doncarlito87 Wie erhalte ich ein JSON aus eine NativeQuery (Spring Boot)? Frameworks - Spring, Play, Blade, Vaadin & Co 8
Avalon @Query Select Abfrage liefert falsche Werte (Spring Boot, JPA, Hibernate) Frameworks - Spring, Play, Blade, Vaadin & Co 3
Avalon Erstellung Dockerimage mit spring-boot:build-image in Spring Boot mit Umgebungsvariablen Frameworks - Spring, Play, Blade, Vaadin & Co 0
D Spring Boot Field Injection in MapStruct Frameworks - Spring, Play, Blade, Vaadin & Co 5
OnDemand Spring Boot seltsame Logeinträge: Manipulationsversuche? Frameworks - Spring, Play, Blade, Vaadin & Co 2
D Spring Boot Mile Stone und Snapshot Versionen Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand Spring Boot Exception Body Frameworks - Spring, Play, Blade, Vaadin & Co 2
N Spring Boot - Overkill für private Projekte? Frameworks - Spring, Play, Blade, Vaadin & Co 3
K Migration eines internen Frameworks zu Spring:Boot Frameworks - Spring, Play, Blade, Vaadin & Co 0
Z Hibernate & Postgres in Spring Boot (Syntaxprobleme) Frameworks - Spring, Play, Blade, Vaadin & Co 2
Z Spring Boot mit JPA;, Hibernate, Rest & Lombok Frameworks - Spring, Play, Blade, Vaadin & Co 8
OnDemand Spring Security/Boot/Vaadin Cookie Problem bei iFrame Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Spring Boot: Feld ignorieren Frameworks - Spring, Play, Blade, Vaadin & Co 3
N Buch zum Spring Framework bzw. Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 3
OnDemand Jasypt Spring Boot HIbernate wie komme ich an den Key? Frameworks - Spring, Play, Blade, Vaadin & Co 4
8u3631984 Spring Boot im Docker Container - Logback wird nicht verwendet Frameworks - Spring, Play, Blade, Vaadin & Co 13
sascha-sphw Spring Boot Resource Server (OAuth2) @MockMvc Frameworks - Spring, Play, Blade, Vaadin & Co 5
OnDemand Spring Boot CDN Frameworks - Spring, Play, Blade, Vaadin & Co 1
OnDemand Spring Boot Deserialiserung mit JSON Frameworks - Spring, Play, Blade, Vaadin & Co 9
OnDemand Spring Boot POST zu PHP API Frameworks - Spring, Play, Blade, Vaadin & Co 12
OnDemand Spring Boot WebClient ErrorHandling Frameworks - Spring, Play, Blade, Vaadin & Co 5
8u3631984 Spring boot : Unique Constraint mit Many to Many Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand Spring Boot Repository null Frameworks - Spring, Play, Blade, Vaadin & Co 1
J Spring boot mit Keyclaok rollen basiert Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand Spring Boot Scheduler flexibel machen Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Spring Boot + Vaadin API Security Frameworks - Spring, Play, Blade, Vaadin & Co 1
S Spring Boot und seine Module verstehen Frameworks - Spring, Play, Blade, Vaadin & Co 3
R Architektur für Spring Boot Projekt Frameworks - Spring, Play, Blade, Vaadin & Co 5
M Spring Boot, Versionskontrolle und Entwicklungsumgebung und Deployment Frameworks - Spring, Play, Blade, Vaadin & Co 2
Avalon Image aus JSON Objekt im Browser anzeigen (BLOB, extrahieren, konvertieren) Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 4
Avalon CSS Datei wird in Spring Boot mit Thymeleaf im Standardordner nicht gefunden Frameworks - Spring, Play, Blade, Vaadin & Co 3
OnDemand Spring Boot Mapping null bei GET Aufruf Frameworks - Spring, Play, Blade, Vaadin & Co 8
OnDemand Spring Boot Test mit Junit Frameworks - Spring, Play, Blade, Vaadin & Co 8
J Spring Boot - Reactor Frameworks - Spring, Play, Blade, Vaadin & Co 1
L Spring Boot, H2 und Restschnittstelle synchonisation mit Client Frameworks - Spring, Play, Blade, Vaadin & Co 10
TonioTec Spring Boot Datenbankabfrage Frameworks - Spring, Play, Blade, Vaadin & Co 7
OnDemand Spring Boot encoding Slash in URL Parameter Frameworks - Spring, Play, Blade, Vaadin & Co 7
S Spring Boot startet nicht Frameworks - Spring, Play, Blade, Vaadin & Co 3
S Spring Boot -> War File | 404 in Tomcat Frameworks - Spring, Play, Blade, Vaadin & Co 20
LimDul Spring Boot Anwendung "automatisch" neustarten Frameworks - Spring, Play, Blade, Vaadin & Co 3
A Spring boot Frameworks - Spring, Play, Blade, Vaadin & Co 18
bueseb84 Unit Test mit Spring Boot - Service Autowired Frameworks - Spring, Play, Blade, Vaadin & Co 5
OnDemand DTO <> Entity Hibernate Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 28
OnDemand Verständnisfrage DTO Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 19
OnDemand Spring Boot Load Balancing Frameworks - Spring, Play, Blade, Vaadin & Co 5
S Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 1
OnDemand Spring Boot Threads Frameworks - Spring, Play, Blade, Vaadin & Co 6
S Spring Boot: Wert aus Config Datei ermitteln Frameworks - Spring, Play, Blade, Vaadin & Co 3
S Spring Boot: Ein geschütztes Verzeichnis Frameworks - Spring, Play, Blade, Vaadin & Co 1
bueseb84 Probleme mit Spring Boot Docker und Bootstrap Frameworks - Spring, Play, Blade, Vaadin & Co 9
OnDemand Spring Boot Eureka/Zuul Frameworks - Spring, Play, Blade, Vaadin & Co 0
F Redirect in einer Spring Boot WebApplication Frameworks - Spring, Play, Blade, Vaadin & Co 7
B Erstes Spring Boot Projekt: Gameserver-Manager Frameworks - Spring, Play, Blade, Vaadin & Co 5
V Spring Boot, thymeleaf, Eingaben cashen oder per session speichern? Frameworks - Spring, Play, Blade, Vaadin & Co 2
S Spring Boot Security Frameworks - Spring, Play, Blade, Vaadin & Co 3
S Spring Boot i18n Frameworks - Spring, Play, Blade, Vaadin & Co 28
bueseb84 Spring Boot : Update H2 Repository Frameworks - Spring, Play, Blade, Vaadin & Co 14
A Spring Boot/ OneToMany Relation Frameworks - Spring, Play, Blade, Vaadin & Co 29
S Spring Boot testen mit Service Klassen Frameworks - Spring, Play, Blade, Vaadin & Co 4
L Controller Spring Boot mit Java Frameworks - Spring, Play, Blade, Vaadin & Co 20
J Spring Boot H2 Datbase Frameworks - Spring, Play, Blade, Vaadin & Co 2
J Spring Boot Thymleaf mit Java.Optional Frameworks - Spring, Play, Blade, Vaadin & Co 0
L JavaFX Anwendung mit Spring Boot und mehrere FXML Forms Frameworks - Spring, Play, Blade, Vaadin & Co 5
P Mit Maven (und Spring-boot) ein FatJAR und ein EAR bauen Frameworks - Spring, Play, Blade, Vaadin & Co 3
OnDemand Spring Boot Basic Authentication langsam Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand Start Stop Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 4
H Spring Boot - Dependency Injection Frameworks - Spring, Play, Blade, Vaadin & Co 26
B Java Spring Boot - POM-Problem Frameworks - Spring, Play, Blade, Vaadin & Co 8
OnDemand Spring Boot parallele Requests Frameworks - Spring, Play, Blade, Vaadin & Co 1
OnDemand Spring Boot Resttemplate exchange XML Frameworks - Spring, Play, Blade, Vaadin & Co 6
S Root-Pfad zu meiner Spring Boot Application Frameworks - Spring, Play, Blade, Vaadin & Co 3
OnDemand Spring Boot Error Logging Frameworks - Spring, Play, Blade, Vaadin & Co 5
OnDemand Spring Boot Transactions Frameworks - Spring, Play, Blade, Vaadin & Co 10

Ähnliche Java Themen

Neue Themen


Oben