Daten per API senden, parallel

OnDemand

Top Contributor
Hallo zusammen,

wir senden an externe API viele viele Daten. Derzeit nach einander, das dauert aber zu lange. Wir machen das nun testweise über einen Taskexecutor mit 5 Threads. Ist dadurch auch wesentlich schneller. Nun könnte man ja auch sagen, wir senden 50 parallel. Das Zielsystem kann auf verschiedenen Servern hosten, sodass nicht klar ist wie viel das Ziel verkraftet, ehe es abschmiert.

Der Hersteller des Zielsystems sagt auch "kommt drauf an, was für ein Server drunter liegt". Nun wollen wir dem User die Möglichkeit geben, die Anzahl der Threads einzugeben. Dabei gibts garantiert Kandidaten, die denken mit ihrem 5 EUR Hosting können sie 100 threads drauf los jagen. Ein anderer User hat vielleicht ne mega Maschine drunter die 500 Threads ab kann.

Wie könnte man herausfinden oder einschätzen was der Zielserver ab kann? Mir fällt da nur herantasten ein. Hat jemand ähnliche Erfahrungen?
 
Entweder der Kund oder dessen Admin/Hoster. Also wenns knallt ist es zu spät. Sollte möglichst nicht passieren 😀 aber ohne Zusammenarbeit mit dem Hoster wird das wohl sehr schwer.
 
Da muesst ihr halt einmal eine gewisse Basis-Linie etablieren. "Maschine mit 16 Kernen und 64GB RAM kann x Threads" und dann davon weggehen. Ihr muesst ja wahrscheinlich auch Ruecksicht auf die restliche Last auf der Maschine nehmen. Also ich wuerde mal behaupten das 12-16 Threads gleichzeitig kein Problem sein sollten, egal was ihr da ansprecht, aber das ist eine Zahl welche gut klingt und ich mir aus dem Hintern gezogen habe.

Der absolute Overkill waere natuerlich wenn ihr Profiling einbaut. Wenn zum Beispiel euer senden mit einem Thread 5 Stunden dauert, dann startet ihr mal mit einem Thread und mess mal x Anfragen lang die durchschnittliche Antwort-Zeit, dann erhoeht ihr auf zwei, und lasst das eine Weile laufen ob die Antwort-Zeit relativ stabil geblieben ist, dann vier, sechs, acht, zehn bis zu einem Limit (sagen wir mal 16). Wenn die Antwort-Zeit zu hochgegangen ist, geht ihr wieder auf die vorherige Anzahl zurueck. Aber sowas zahlt sich nur aus wenn der Task ansonsten 5 Stunden aufwaerts laufen wuerde, und ihr das aber unbedingt in weniger Zeit abfackeln muesst.
 
In dem Fall hat der Benutzer aber eine garantierte Verfügbarkeit von Ressourcen. Meinetwegen hat 3Gb RAM gebucht, also bekommt er die auch. Das könnte man irgendwie mit einbeziehen
 
Ich habe gerade ein änliches Problem. Dabei kommt es natürlich immer auf die konkrete Anwendung an aber ich habe für mich entschieden - die verbügbaren Cores mal 2 ist die Anzahl der Threads. Normalerweise würde man nicht so hoch gehen, es laufen aber immer wieder Datenbankabfragen und ich gehe davon aus, wenn die DB arbeitet hat der Server Zeit für anderes Zeug.
Java:
int cores = Runtime.getRuntime().availableProcessors();
Ich denke so komme ich mit der festgelegten Mindestgröße des RAM nicht in Schwierigkeiten. Man könnte natürlich noch den verfügbaren Speicher einbeziehen, z.B.: Wenn verfügbarer Speicher >= (Mindestgröße des RAM * 2) ? (cores * 1.5) : cores. Es laufen auf dem Zielserver aber evtl. noch andere Prozesse, die sollen ja auch noch ein Chance auf angemessene Antwortzeiten haben.
 
Danke, aber bei mir ist eher das Problem, dass ich mich an die Gegenseite anpassen muss. Da hilft es nix zu wissen, wie viel ich als Sender kann, sondern muss schauen was das Gegenüber verkraftet.
 
Danke, aber bei mir ist eher das Problem, dass ich mich an die Gegenseite anpassen muss. Da hilft es nix zu wissen, wie viel ich als Sender kann, sondern muss schauen was das Gegenüber verkraftet.
Ja die Infos frage ich von der Gegenseite ab bzw. sind für Support sowieso verfügbar und baue dann die jeweilige Anzahl an Verbindungen auf.
 
Ah ok. Das ist ne gute Idee. Das Gegensystem läuft in PHP, da gibts auch irgendwie Childprozesse die man beachten sollte schätz ich und der PHP Memory der zugewiesen wurde
 

Zurück
Oben