Motivation
Mit der Microservice-Architektur können Sie beim Schreiben von REST-API-Services zwischen Technologien und Programmiersprachen wählen. Welche Sprache ist beim Schreiben einer REST-API-Anwendung besser zu wählen, um mehr gleichzeitigen Benutzern eine schnelle und stabile Antwort auf derselben Hardware zu bieten? Um diese Frage zu beantworten, wäre es schön, den Leistungsunterschied derselben Anwendung zu sehen, die in Java und GO geschrieben wurde.
Haftungsausschluss
Alle in diesem Experiment vorgestellten Ergebnisse sind ein besonderes Beispiel für die Verwendung von Java und GO und sollten nicht zur Beschreibung der Leistung dieser Sprachen unter anderen Bedingungen verwendet werden.
Allgemeine Geschäftsbedingungen
- Keine zusätzlichen Einstellungen zur Steigerung der Produktivität. Frameworks und Bibliotheken sollten mit Standardeinstellungen verwendet werden.
- Keine ORM-Frameworks. Nur Datenbanktreiber und dieselben Abfragen in beiden Anwendungen.
Planen
- Erstellen wir zwei einfache REST-API-Anwendungen in Java und GO mit einer PostgreSQL-Datenbank
- Erstellen Sie Lasttests mit Jmeter
- Führen Sie jede Anwendung, Datenbank und jeden Test auf separaten AWS-Instanzen aus
- Führen Sie Tests durch und sammeln Sie Ergebnisse
Anwendung testen
Als Testsystem habe ich zwei Anwendungen erstellt:
bank-java und
bank-go . Dies ist wahrscheinlich die einfachste Bankanwendung der Welt. Alles, was es tun kann, ist, neue Kunden mit einem anfänglichen Guthaben zu erstellen, Geld von einem Kunden auf einen anderen zu überweisen und das Guthaben anzuzeigen.
API:- Post / client / new / {balance} - Erstellt einen Client mit einem anfänglichen Kontostand
- Post / Transaktion - Überweist Geld von einem Kunden auf einen anderen
- Get / client / {id} / balance - Zeigt den Kontostand an
Frameworks und Bibliotheken
Bei der Auswahl dieser Stapel habe ich die neuesten, beliebtesten und einfachsten Frameworks und Bibliotheken verwendet, um die erforderlichen Funktionen so schnell wie möglich zu implementieren.
Bank-Java: Java 11, Spring Boot 2.0.4, Spring-Web 5.0.8, PostgreSQL JDBC 4.2.4
Bank-go: Go 1.8, Gorilla / Mux, github.com/lib/pq
Testumgebung
AWS wurde als Testumgebung verwendet.
Die folgenden EC2-Instanzen wurden erstellt:
- Bank-go t2.micro (variable Steuergeräte, 1 vCPUs, 2,5 GHz, Intel Xeon-Familie, 1 GiB Speicher, nur EBS)
- Bank-java t2.micro (variable Steuergeräte, 1 vCPUs, 2,5 GHz, Intel Xeon-Familie, 1 GiB Speicher, nur EBS)
- Postgres d2.xlarge (14 ECUs, 4 vCPUs, 2,4 GHz, Intel Xeon E52676v3, 30,5 GiB Speicher, 3 x 2048 GiB Speicherkapazität)
- Bank-Test t2.2xlarge (variable Steuergeräte, 8 vCPUs, 2,3 GHz, Intel Broadwell E5-2686v4, 32 GiB Speicher, nur EBS)
Alle Instanzen verwenden Ubuntu Server 18.04 LTS (HVM), SSD-Volume-Typ

Testprojekt
Der Jmeter-Test ruft jede API aus der obigen Liste auf, überprüft, ob der Status der Antwort 200 ist und der Antworttext eine ID enthält. Für jede Anwendung habe ich sie mit der Anzahl der gleichzeitigen Benutzer 1000, 2000 usw. gestartet. bis zu 10.000.
Ein vollständiges Protokoll der Ergebnisse finden Sie
hier .
Aggregierte Ergebnisse



Beschreibung der Ergebnisse
Beide Anwendungen arbeiten perfekt mit der Anzahl der Benutzer von 1000. Ab 2000 GO verliert die Anwendung erheblich an Leistung und ein wenig an Stabilität. In Java beginnt diese Zeile mit 3000.
Fazit
Mit derselben REST-API-Hardware kann eine Java-Anwendung doppelt so viele * gleichzeitige Benutzer unterstützen wie eine GO-Anwendung mit einer PostgreSQL-Datenbank.
* Diese Zahl gilt nur, wenn die gleichen Testbedingungen wie in diesem Experiment verwendet werden.