Java
Go
27 September 2018

Java vs GO. Тестирование большим числом пользователей

From Sandbox

Мотивация


Микросервисная архитектура позволяет выбирать между технологиями и языками программирования при написании REST api сервисов. Какой язык лучше выбрать, для написании REST api приложения, чтобы обеспечить большее количество одновременных пользователей быстрым и стабильным ответом на одном и том же железе? Чтобы ответить на этот вопрос было бы хорошо увидеть разницу в производительности одного и того же приложения написанного на Java и GO.

Дисклеймер


Все результаты представленные в данном эксперименте являются частным примером использования Java и GO и не должны использоваться для описания производительности этих языков в других условиях.

Условия/Ограничения


  • Никаких дополнительных настроек по увеличению производительности. Фреймворки и библиотеки должны использоваться с настройками по-умолчанию.
  • Никаких ORM фреймворков. Только драйвера баз данных и одинаковые запросы в обоих приложениях.

План


  1. Создадим два простых REST api приложения на Java и GO c PostgreSQL базой данных
  2. Создадим нагрузочные тесты при помощи Jmeter
  3. Запустим каждое приложение, базу и тесты на отдельных AWS экземплярах
  4. Прогоним тесты и соберем результаты

Тестируемое приложение


В качестве системы для тестирования я создал два приложения: bank-java и bank-go. Это наверное самое простое банк-приложение в мире. Все что оно умеет делать это создавать новых клиентов с начальным балансом, переводить средства от одного клиента другому и показывать баланс.
API:

  • Post /client/new/{balance} — создает клиента с начальным балансом
  • Post /transaction — переводит средства от одного клиента другому
  • Get /client/{id}/balance — показывает баланс

Фреймворки и библиотеки


При выборе тех стэка я использовал самые новые, популярные и простые фреймворки и библиотеки, чтобы как можно быстрее реализовать нужный функционал.
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

Тестовая среда


В качестве тестовой среды был использован AWS.

Следующие EC2 экземпляры были созданы:

  1. Bank-go t2.micro (Variable ECUs, 1 vCPUs, 2.5 GHz, Intel Xeon Family, 1 GiB memory, EBS only)
  2. Bank-java t2.micro (Variable ECUs, 1 vCPUs, 2.5 GHz, Intel Xeon Family, 1 GiB memory, EBS only)
  3. Postgres d2.xlarge (14 ECUs, 4 vCPUs, 2.4 GHz, Intel Xeon E52676v3, 30.5 GiB memory, 3 x 2048 GiB Storage Capacity)
  4. Bank-test t2.2xlarge (Variable ECUs, 8 vCPUs, 2.3 GHz, Intel Broadwell E5-2686v4, 32 GiB memory, EBS only)

Все экземпляры используют Ubuntu Server 18.04 LTS (HVM), SSD Volume Type



Тестовый проект


Jmeter тест вызывает каждый API из списка сверху, проверяет что статус ответа равен 200 и тело ответа содержит id. Для каждого приложения я запустил его с числом одновременных пользователей 1000, 2000 и т.д. до 10000.

С полным логом результатов можно ознакомиться здесь.

Агрегированные результаты








Описание результатов


Оба приложения работают отлично при числе пользователей 1000. Начиная с 2000 GO приложение начинает значительно терять в производительности и чуть-чуть в стабильности. У Java этот рубеж начинается с 3000.

Заключение


Используя одно и то же оборудование REST api приложение Java может поддерживать вдвое* больше одновременных пользователей, чем приложение GO с базой данных PostgreSQL.

*Данная цифра верна только при использовании тех же условий испытания что и в данном эксперименте

-8
14.1k 25
Comments 33
Top of the day