2016-11-18 3 views
0

Ich implementiere eine REST-API mit Spring Boot und @RestController mit Java 8. Eine der Controller-Methoden muss einen anderen REST-API-Dienst von Drittanbietern aufrufen. Die Methode ist wie folgt umrissen (Datenformat ist JSON):Spring @RestController ruft eine große Anzahl von Anfragen auf

  • Rufen Sie eine API-Methode von Drittanbietern auf, um eine Liste von Kandidaten zu erhalten (jeder Kandidat wird als ein Objekt mit einigen grundlegenden Informationen dargestellt).
  • Rufen Sie für jeden Kandidaten eine andere API-Methode eines Drittanbieters auf, um detailliertere Informationen über den Kandidaten zu erhalten.
  • Mash up die Ergebnisse, im Wesentlichen "Anreicherung" aller Kandidaten Objekte aus dem ersten Anruf.
  • Geben Sie die Liste der angereicherten Kandidatenobjekte zurück.
  • Ich wollte @RestTemplate für alle Aufrufe auf der 3rd Party API verwenden. Ich bin besorgt, dass dies für eine große Anzahl von Kandidaten (sagen wir 500-1000) zu einem riesigen Leistungsengpass wird, der blockierend umgesetzt wird. Ich bin mir nicht ganz sicher, welcher Ansatz für die beste Leistung empfohlen wird. Wie kann ich das skalieren, sodass mehrere Benutzer gleichzeitig auf meine API zugreifen können?

    Antwort

    4

    Ihre Frage ist sehr breit und ich glaube nicht, jemand in der Lage sein, Ihnen eine detaillierte Antwort zu geben, aber:

    1. Ihr Fall scheint wie ein perfekter Anwendungsfall für RxJava: ein Strom von Kandidaten Das wird transformiert, indem zusätzliche Informationen aus anderen Quellen hinzugefügt werden - alles async.

    2. Ich würde RestTemplate überspringen und für Retrofit2 zusammen mit ihrer tollen RxJava Integration gehen. Siehe diese grundlegenden tutorial1 und tutorial2.

    3. 1000 Datensätze ist nicht viel, aber es hängt auch von der Leistung der Downstream-Dienste. Sie müssen es selbst testen.

    4. Wenn Sie mehr wissen wollen über RxJava gibt es einige great docs online sowie ein new amazing book von Tomasz Nurkiewicz und Ben Tensen.

    Viel Glück!

    +0

    eingebaut werden Dank! Dies ist ein sehr aufschlussreicher Beitrag; Ich werde die Tutorials durchgehen und etwas über RxJava und Retrofit2 lernen. Kann dies in eine Spring Boot-Umgebung passen? Ich bin auf diese [Post] (https://spring.io/blog/2016/01/04/springone2gx-2015-replay-introducing-rxjava-into-a-spring-boot-rest-api) gestoßen, die zu bürgen scheint für die Integration, aber ich habe mich gefragt, ob du in dieser Hinsicht deine eigenen Erfahrungen gemacht hast. –

    +0

    Ja natürlich. Retrofit kann leicht mit Spring Boot verwendet werden. Sie müssen nur eine Instanz des OkHttp3-Clients erstellen und diese dann zum Instanziieren des REST-Clients von Retrofit2 verwenden. Dieser Kunde sollte eine Frühlingsbohne sein - dann ist es nur ein typischer Frühling DI. Diese Tutoren decken es gut ab. –

    0

    Ihr Anwendungsserver verwaltet einen Thread-Pool, sodass viele Anfragen gleichzeitig auf Ihren Endpunkt treffen können. Sofern Ihr Thread-Pool nicht die Größe 1 hat, können mehrere Clients gleichzeitig Ihre API verwenden.

    Sehen Sie hier für weitere Erklärung: Spring MVC Rest Services - Number of Threads (Controller Instances)

    finden Sie hier, wie Sie ein Beispiel, wie Threadpoolgröße konfigurieren: Maximum (client request) thread pool size in spring

    Um die Leistung zu verbessern, wenn Anforderungen an die externen Dienste zu machen, würde ich sehen wenn Sie Batch-Anfragen (mehrere Kandidaten gleichzeitig) machen könnten, um die Gesamtzahl der von Ihnen gestellten Anfragen zu reduzieren.

    +0

    Ich kann keine Batch - Anfragen machen, weil die externen Dienste nicht mehrere Kandidaten auf einmal unterstützen :-(Aber ich werde sicherlich in die Optimierung der Thread - Pool - Größe und einige Leistungstests schauen. Ich sollte in Kürze einige Nummern haben. –

    1

    Rafal gab bereits eine gute Antwort. Ich möchte meine 2 Cent hinzufügen. Ihr Fall scheint wie ein perfekter Anwendungsfall für Non-Blocking zu sein. RxJava ist nur eine Implementierung der nicht blockierenden reaktiven Programmierung.Das Gleiche können Sie auch mit anderen Technologie-Stacks erreichen - wie Akka oder Spring Boot mit Netty oder Sog.

    Dies ist ein Beispiel, wie wir reaktive Programmierung mit Spring Boot machen können. https://spring.io/blog/2016/07/28/reactive-programming-with-spring-5-0-m1 Denken Sie daran, dass es immer noch im experimentellen Zustand ist. Reactive streams wird in Java 9

    +0

    Danke für verbürgt sich für die erste Antwort, und zeigt mir auch in Richtung Springboots, die ich bereits benutze. Viel Spaß beim Lesen dieses Wochenende. –

    Verwandte Themen