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
- Vamos criar dois aplicativos API REST simples em Java e GO com um banco de dados PostgreSQL
- Crie testes de carga com o Jmeter
- Execute cada aplicativo, banco de dados e testes em instâncias separadas da AWS
- 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:
- Bank-go t2.micro (ECUs variáveis, 1 vCPUs, 2,5 GHz, Família Intel Xeon, 1 memória GiB, apenas EBS)
- Bank-java t2.micro (ECUs variáveis, 1 vCPUs, 2,5 GHz, Família Intel Xeon, 1 memória GiB, apenas EBS)
- 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)
- 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.