Die Anwendung, die wir erstellen, wird voraussichtlich eine hohe Anzahl gleichzeitiger Benutzer haben. Wir versuchen Spring MVC für den Aufbau unserer API-Ebene zu evaluieren.Leistungsunterschied zwischen Spring MVC nicht blockierend und blockierend
Die folgenden 2-Handler geschrieben wurden - eine Sperr- und eine andere nicht-blockierend:
@RequestMapping("/nblocking")
public DeferredResult<String> nonBlockingProcessing() {
DeferredResult<String> deferredResult = new DeferredResult<>();
executionService.execute(new Runnable() {
@Override
public void run() {
deferredResult.setResult(fetcher.load());
}
});
return deferredResult;
}
@RequestMapping("/blocking")
public String blockingProcessing() {
return fetcher.load();
}
Wir liefen Tests über Jmeter, jeden Endpunkt mit 3500 gleichzeitigen Benutzern zu treffen.
Ergebnisse mit blockierenden Anruf:
Ergebnisse mit nicht-blockierenden Anruf:
In dem obigen Code wird der fetcher.load Aufruf einer DB-Abfrage MySql machen (max Verbindungen auf 200) und Verbindungspool von maximaler Größe (50).
Insgesamt sind Durchsatz und durchschnittliche Zeiten bei nicht blockierenden Anrufen besser. Welche weiteren Verbesserungen können wir vornehmen oder welche Faktoren können wir berücksichtigen, um den Durchsatz noch zu verbessern?
"Welche weiteren Verbesserungen können wir vornehmen oder welche Faktoren wir berücksichtigen können, um den Durchsatz noch zu verbessern?" Optimiere den Java-Code. Optimiere die MySQL-Abfrage. Optimiere die MySQL-Einstellungen. –
Wie lange benutzt die 'fetcher.load()' Anweisung? Ich würde prüfen, ob es sich um ein Ladeproblem handelt. –