Java vs GO. Teste por um grande número de usuários

Motivação


A arquitetura de microsserviço permite escolher entre tecnologias e linguagens de programação ao escrever serviços de API REST. Qual idioma é melhor escolher ao escrever um aplicativo API REST para fornecer a usuários mais simultâneos uma resposta rápida e estável no mesmo hardware? Para responder a essa pergunta, seria bom ver a diferença de desempenho do mesmo aplicativo escrita em Java e GO.

Isenção de responsabilidade


Todos os resultados apresentados neste experimento são um exemplo particular do uso de Java e GO e não devem ser usados ​​para descrever o desempenho dessas linguagens em outras condições.

Termos e Condições


  • Não há configurações adicionais para aumentar a produtividade. Estruturas e bibliotecas devem ser usadas com configurações padrão.
  • Sem estruturas ORM. Somente drivers de banco de dados e as mesmas consultas nos dois aplicativos.

Planejar


  1. Vamos criar dois aplicativos API REST simples em Java e GO com um banco de dados PostgreSQL
  2. Crie testes de carga com o Jmeter
  3. Execute cada aplicativo, banco de dados e testes em instâncias separadas da AWS
  4. Execute testes e colete resultados

Aplicativo de teste


Como sistema de teste, criei dois aplicativos: bank-java e bank-go . Esta é provavelmente a aplicação bancária mais simples do mundo. Tudo o que pode fazer é criar novos clientes com um saldo inicial, transferir fundos de um cliente para outro e mostrar o saldo.
API:

  • Post / client / new / {balance} - cria um cliente com um saldo inicial
  • Pós / transação - transfere fundos de um cliente para outro
  • Obter / cliente / {id} / saldo - mostra o saldo

Estruturas e bibliotecas


Ao escolher essas pilhas, usei as estruturas e bibliotecas mais recentes, mais populares e mais simples para implementar a funcionalidade necessária o mais rápido possível.
Banco-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

Ambiente de teste


A AWS foi usada como um ambiente de teste.

As seguintes instâncias do EC2 foram criadas:

  1. Bank-go t2.micro (ECUs variáveis, 1 vCPUs, 2,5 GHz, Família Intel Xeon, 1 memória GiB, apenas EBS)
  2. Bank-java t2.micro (ECUs variáveis, 1 vCPUs, 2,5 GHz, Família Intel Xeon, 1 memória GiB, apenas EBS)
  3. Postgres d2.xlarge (14 ECUs, 4 vCPUs, 2,4 GHz, Intel Xeon E52676v3, memória de 30,5 GiB, capacidade de armazenamento de 3 x 2048 GiB)
  4. Teste de banco t2.2xlarge (ECUs variáveis, 8 vCPUs, 2,3 GHz, Intel Broadwell E5-2686v4, memória de 32 GiB, apenas EBS)

Todas as instâncias usam o Ubuntu Server 18.04 LTS (HVM), tipo de volume SSD



Projeto de teste


O teste Jmeter chama cada API da lista acima, verifica se o status da resposta é 200 e o corpo da resposta contém o ID. Para cada aplicativo, eu o iniciei com o número de usuários simultâneos 1000, 2000, etc. até 10.000.

Um registro completo dos resultados pode ser encontrado aqui .

Resultados Agregados








Descrição dos resultados


Ambos os aplicativos funcionam perfeitamente com o número de usuários 1000. A partir do 2000 GO, o aplicativo começa a perder significativamente em desempenho e um pouco em estabilidade. Em Java, essa linha começa com 3000.

Conclusão


Usando o mesmo hardware da API REST, um aplicativo Java pode suportar o dobro * de usuários simultâneos que um aplicativo GO com um banco de dados PostgreSQL.

* Esta figura é verdadeira apenas quando se utiliza as mesmas condições de teste que nesta experiência.

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


All Articles