Java vs GO. Pruebas realizadas por un gran número de usuarios.

Motivación


La arquitectura de microservicios le permite elegir entre tecnologías y lenguajes de programación al escribir servicios de API REST. ¿Qué idioma es mejor elegir al escribir una aplicación REST api para proporcionar a los usuarios más simultáneos una respuesta rápida y estable en el mismo hardware? Para responder a esta pregunta, sería bueno ver la diferencia en el rendimiento de la misma aplicación escrita en Java y GO.

Descargo de responsabilidad


Todos los resultados presentados en este experimento son un ejemplo particular del uso de Java y GO y no deben usarse para describir el rendimiento de estos lenguajes en otras condiciones.

Términos / condiciones


  • No hay configuraciones adicionales para aumentar la productividad. Los marcos y las bibliotecas deben usarse con la configuración predeterminada.
  • No hay marcos ORM. Solo controladores de base de datos y las mismas consultas en ambas aplicaciones.

Plan


  1. Creemos dos aplicaciones simples de API REST en Java y GO con una base de datos PostgreSQL
  2. Crear pruebas de carga con Jmeter
  3. Ejecute cada aplicación, base de datos y pruebas en instancias de AWS separadas
  4. Ejecute pruebas y obtenga resultados

Aplicación de prueba


Como sistema de prueba, creé dos aplicaciones: bank-java y bank-go . Esta es probablemente la aplicación bancaria más simple del mundo. Todo lo que puede hacer es crear nuevos clientes con un saldo inicial, transferir fondos de un cliente a otro y mostrar el saldo.
API:

  • Post / client / new / {balance} : crea un cliente con un saldo inicial
  • Contabilización / transacción : transfiere fondos de un cliente a otro
  • Obtener / cliente / {id} / balance : muestra el saldo

Marcos y bibliotecas


Al elegir esas pilas, utilicé los frameworks y bibliotecas más nuevos, más populares y más simples para implementar la funcionalidad necesaria lo más rápido posible.
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

Entorno de prueba


AWS se utilizó como entorno de prueba.

Se crearon las siguientes instancias de EC2:

  1. Bank-go t2.micro (ECU variables, 1 vCPU, 2.5 GHz, Familia Intel Xeon, 1 memoria GiB, solo EBS)
  2. Bank-java t2.micro (ECU variables, 1 vCPU, 2.5 GHz, familia Intel Xeon, 1 memoria GiB, solo EBS)
  3. Postgres d2.xlarge (14 ECU, 4 vCPU, 2.4 GHz, Intel Xeon E52676v3, memoria de 30.5 GiB, 3 x 2048 capacidad de almacenamiento GiB)
  4. Bank-test t2.2xlarge (ECU variables, 8 vCPU, 2.3 GHz, Intel Broadwell E5-2686v4, memoria 32 GiB, solo EBS)

Todas las instancias usan Ubuntu Server 18.04 LTS (HVM), tipo de volumen SSD



Proyecto de prueba


La prueba Jmeter llama a cada API de la lista anterior, verifica que el estado de la respuesta sea 200 y que el cuerpo de la respuesta contenga id. Para cada aplicación, la lancé con el número de usuarios simultáneos 1000, 2000, etc. hasta 10,000.

Puede encontrar un registro completo de los resultados aquí .

Resultados agregados








Descripción de los resultados.


Ambas aplicaciones funcionan perfectamente con la cantidad de usuarios 1000. A partir de 2000 GO, la aplicación comienza a perder significativamente en rendimiento y un poco en estabilidad. En Java, esta línea comienza con 3000.

Conclusión


Usando el mismo hardware REST api, una aplicación Java puede admitir el doble de usuarios concurrentes * que una aplicación GO con una base de datos PostgreSQL.

* Esta cifra es cierta solo cuando se usan las mismas condiciones de prueba que en este experimento.

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


All Articles