2016-08-04 22 views
0

Ich habe eine REST API mit Spring Boot erstellt, die grundsätzlich zwei Bilder per POST akzeptiert und einen Bildvergleich durchführt. Die API wird synchron aufgerufen. Ich verwende keinen externen Anwendungsserver, um den Dienst zu hosten, sondern packe es als ein jar und führe es aus.Mehrere Anfragen effizient bearbeiten in einer REST API

@RequestMapping(method = RequestMethod.POST, value = "/arraytest") 

    public String compareTest(@RequestParam("query") MultipartFile queryFile,@RequestParam("test") MultipartFile testFile,RedirectAttributes redirectAttributes,Model model) throws IOException{ 
     CoreDriver driver=new CoreDriver(); 
     boolean imageResult=driver.initProcess(queryFile,testFile); 
     model.addAttribute("result",imageResult); 
     return "resultpage"; 

    } 

Der Service könnte parallel über mehrere Maschinen hinweg aufgerufen werden und ich würde meinen Service benötigen, um effizient zu arbeiten. Ich versuche zu verstehen, wie parallele Anrufe an einen REST-Dienst gehandhabt werden. Wenn die Anfrage an den Service gesendet wird, wird ein einzelnes Objekt des Service erstellt und dasselbe Objekt in mehreren Threads verwendet, um mehrere Anfragen zu bearbeiten? Eine weitere Frage wäre, ob es möglich ist, die Leistung eines Dienstes im Hinblick auf die Bearbeitung von Anforderungen zu verbessern, anstatt die Leistung der Dienstfunktionalität zu verbessern.

Antwort

0

Spring Controller (und die meisten Spring Beans) sind Singletons, d. H. Es gibt eine einzelne Instanz in Ihrer Anwendung, die alle Anfragen bearbeitet.

Angenommen, dies sind keine Web-Sockets (und wenn Sie nicht wissen, was das bedeutet, ist es wahrscheinlich nicht), pflegen Servlet-Container in der Regel einen Thread-Pool und nehmen einen derzeit nicht verwendeten Thread aus dem Pool und verwenden ihn zu behandeln die Anfrage.

Sie können dies tun, indem Sie beispielsweise einige Aspekte des Thread-Pools ändern (anfängliche Threads, max. Threads usw.). Dies ist das Servlet-Container-Zeug (d. H. Konfiguration von Tomcat/Jetty/was auch immer Sie verwenden), nicht Frühling an sich.

Sie können auch andere http-Aspekte wie die Komprimierung einstellen. Dies kann normalerweise über den Container erfolgen, aber wenn ich mich richtig erinnere, bietet spring einen Servlet-Filter, der dies tut.

Die Bildbibliothek und die von Ihnen ausgeführten Bildoperationen spielen ebenfalls eine Rolle. Viele Bibliotheken konvertieren das Bild im Arbeitsspeicher, um Operationen auszuführen. Dies bedeutet, dass ein 3-Megapixel-JPG mehr als 100 Megapixel Heapspeicher belegen kann. Dies hat zur Folge, dass Sie möglicherweise eine Art von semaphore benötigen, um die gleichzeitige Bildverarbeitung zu begrenzen.

Der beste Ansatz hier ist, mit verschiedenen Bibliotheken zu experimentieren und zu sehen, was am besten für Ihren Anwendungsfall funktioniert. Hoffe das hilft.

0

Der Controller wird Singleton sein, aber es gibt Möglichkeiten, die Verarbeitung asynchron zu machen. Wie ein Thread Pool oder JMS. Sie können auch mehrere Knoten haben. Auf diese Weise können Sie die Back-End-Verarbeitung skalieren, solange Sie einen Schlüssel zurückgeben und einen Service haben, den Clients abfragen können, um das Ergebnis später zu erhalten.

Außerdem können Sie Ihre App Cluster, so dass mehr Knoten zu verarbeiten sind. Auch wenn möglich, Cache-Ergebnisse; wenn Sie die gleiche Eingabe erhalten und sie haben die gleiche Ausgabe für 30% oder mehr der Anfragen.