Java vs GO. Test par un grand nombre d'utilisateurs

La motivation


L'architecture de microservice vous permet de choisir entre les technologies et les langages de programmation lors de l'écriture de services api REST. Quelle langue est préférable de choisir lors de l'écriture d'une application REST api pour fournir à plus d'utilisateurs simultanés une réponse rapide et stable sur le même matériel? Pour répondre à cette question, il serait intéressant de voir la différence de performances de la même application écrite en Java et GO.

Clause de non-responsabilité


Tous les résultats présentés dans cette expérience sont un exemple particulier de l'utilisation de Java et GO et ne doivent pas être utilisés pour décrire les performances de ces langages dans d'autres conditions.

Termes / Conditions


  • Aucun paramètre supplémentaire pour augmenter la productivité. Les cadres et les bibliothèques doivent être utilisés avec les paramètres par défaut.
  • Aucun cadre ORM. Seuls les pilotes de base de données et les mêmes requêtes dans les deux applications.

Plan


  1. Créons deux applications API REST simples en Java et GO avec une base de données PostgreSQL
  2. Créer des tests de charge avec Jmeter
  3. Exécutez chaque application, base de données et tests sur des instances AWS distinctes
  4. Exécutez des tests et collectez les résultats

Application de test


En tant que système de test, j'ai créé deux applications: bank-java et bank-go . Il s'agit probablement de l'application bancaire la plus simple au monde. Tout ce qu'il peut faire, c'est créer de nouveaux clients avec un solde initial, transférer des fonds d'un client à un autre et afficher le solde.
API:

  • Post / client / new / {balance} - crée un client avec un solde initial
  • Post / transaction - transfère des fonds d'un client à un autre
  • Get / client / {id} / balance - affiche le solde

Cadres et bibliothèques


Lors du choix de ces piles, j'ai utilisé les cadres et bibliothèques les plus récents, les plus populaires et les plus simples pour implémenter les fonctionnalités nécessaires le plus rapidement possible.
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

Environnement de test


AWS a été utilisé comme environnement de test.

Les instances EC2 suivantes ont été créées:

  1. Bank-go t2.micro (calculateurs variables, 1 processeur virtuel, 2,5 GHz, famille Intel Xeon, 1 Go de mémoire, EBS uniquement)
  2. Bank-java t2.micro (calculateurs variables, 1 processeur virtuel, 2,5 GHz, famille Intel Xeon, 1 Go de mémoire, EBS uniquement)
  3. Postgres d2.xlarge (14 ECU, 4 vCPU, 2,4 GHz, Intel Xeon E52676v3, 30,5 Gio de mémoire, 3 x 2048 Gio de capacité de stockage)
  4. Test de banque t2.2xlarge (calculateurs variables, 8 processeurs virtuels, 2,3 GHz, Intel Broadwell E5-2686v4, 32 Go de mémoire, EBS uniquement)

Toutes les instances utilisent Ubuntu Server 18.04 LTS (HVM), type de volume SSD



Projet de test


Le test Jmeter appelle chaque API de la liste ci-dessus, vérifie que l'état de la réponse est 200 et que le corps de la réponse contient id. Pour chaque application, je l'ai lancée avec le nombre d'utilisateurs simultanés 1000, 2000, etc. jusqu'à 10 000.

Un journal complet des résultats peut être trouvé ici .

Résultats agrégés








Description des résultats


Les deux applications fonctionnent parfaitement avec le nombre d'utilisateurs 1000. À partir de 2000 GO, l'application commence à perdre considérablement en performances et un peu en stabilité. En Java, cette ligne commence par 3000.

Conclusion


En utilisant le même matériel REST api, une application Java peut prendre en charge deux fois plus * d'utilisateurs simultanés qu'une application GO avec une base de données PostgreSQL.

* Ce chiffre n'est vrai que lorsque vous utilisez les mêmes conditions de test que dans cette expérience.

Source: https://habr.com/ru/post/fr424649/


All Articles