Нагрузочное тестирование. Gatling

В этом уроке не будет теории нагрузочного тестирования - это отдельная наука, которой можно посвятить целый курс. Чтобы глубже погрузиться в тему, можете посмотреть неплохие доклады Григория Кошелева "Как (не) надо проводить нагрузочное тестирование" и Алексея Рагозина "Теория и практика нагрузочного тестирования".

На занятии вы на практике пощупаете, как ведет себя наша система микросервисов под высокой нагрузкой и получить опыт работы с Highload. Он расширит ваш кругозор, трансформирует инженерное мышление и выведет ваши знания на новый уровень, а резюме пополнится весомым Senior-скилом.

С результатами сравнения поведения сервисов под такой нагрузкой, проведенной на машине автора курса, можно ознакомиться WebFlux vs Virtual Threads: что происходит при 2000 RPSв его статье на Хабр.


Доступ после оплаты курса


Gatling

  • Подключение Gatling и ключевые концепции Gatling
  • MenuAggregateByIdLoadTest
  • MenuAggregateListLoadTest
  • OrdersServiceLoadTest

Оптимизация конфигурации и запуск нагрузки

  • Оптимизация окружения под нагрузку
  • Оптимизация конфигурации Gateway Service
  • Изменения в Docker Deployment
  • Подготовка и запуск нагрузки
  • Анализ результатов

Заключение

Следует учесть, что при локальном тестировании все компоненты системы (генератор нагрузки, шлюз, микросервисы, базы данных и мониторинг) запущены на одной машине и жестко конкурируют друг с другом за общую память, дисковую подсистему (I/O) и ядра процессора, в то время как в прод-окружении каждый сервис изолирован на выделенных серверах или по нодам кластера. Кроме того, локальная сеть через виртуальный коммутатор Docker (localhost) имеет практически нулевую задержку, но быстро упирается в лимиты операционной системы на количество параллельных TCP-сокетов, тогда как на проде реальная сетевая задержка компенсируется оптимизированным ядром Linux, балансировщиками и механизмами автоматического горизонтального масштабирования (HPA) под нагрузкой. Как результат, локальный тест измеряет физический потолок конкретного персонального компьютера и выявляет заторы в коде, а прод-тест оценивает реальную пропускную способность распределенной сетевой архитектуры.

На этом урок подошел к концу. Мы проделали большую работу: подготовили скрипты генерации высокой нагрузки и опробовали их на практике, но не стоит останавливаться. Вы можете протестировать и другие эндпоинты, а также можете комбинировать нагрузку, чтобы запросы шли одновременно на различные эндпоинты, но в этом случае придется либо горизонтально, либо вертикально масштабировать Gateway Service, который сейчас работает на пределе своих возможностей.

Идеи для развития проекта

  1. Чтобы улучшить производительность, можно внедрить принципы CQRS (Command Query Responsibility Segregation) и Event Sourcing
  2. Также можно подумать над внедрением поиска по сайту с помощью мощного механизма, предоставляемого ElasticSearch.
На текущий момент мы вручную управляем контейнерами с инфраструктурой и микросервисами, что не очень удобно, хотя и возможно, но до тех пор, пока количество микросервисов мало. Когда микросервисов становится гораздо больше, требуется система управления контейнерами.
В современных реалиях де-факто стандартом такой системы является Kubernetes.

Ждем на 2-й части курса по специальной цене:

CloudJava-2: Деплой микросервисов в Kubernetes. Helm


Поздравляю тебя с завершением курса!

Сертификаты доступны в личном профиле по кнопке завершения.
При этом все материалы и участие в этой группе остаются доступны, как прежде. Общаемся, делимся опытом.
После получения сертификата просто попрошу ответить на пару вопросов по курсу, чтобы сделать его лучше.

Наша команда будет оочень благодарна за отзывы, пусть небольшие - пишите сюда
(отзывы находятся в телеграм-группе @JavaOps, присоедининяйтесь для общения).