Всем привет, меня зовут Максим Ажгирей, я руковожу в СберТехе командой разработки, которая занимается развитием инструмента нагрузочного тестирования (НТ) SyTester в линейке интеграционных решений Platform V Synapse.
У SyTester есть две редакции: Enterprise Edition (EE) и Community Edition (CE). Вторая — бесплатная, мы сделали её совсем недавно и разместили на GitVerse, то есть протестировать её может любой желающий. Сегодня расскажу о том, какие проблемы мы смогли решить благодаря этому инструменту, а также об особенностях каждой его версии. Статья будет полезна разработчикам, которым нужно быстро, не тратя время на сложные настройки, провести нагрузочное тестирование, а также специалистам, которым требуется тестировать приложения с очень большими нагрузками (от 100 000 ТПС) и для различных протоколов.
Причины перехода: четыре проблемы
В Сбере сервисную шину на основе зарубежного ПО несколько лет назад заменили на собственную разработку СберТеха — Platform V Synapse, а команда нагрузочного тестирования начала использовать SyTester.
До перехода на SyTester у нас был ряд проблем с нагрузочным тестированием. Ещё одну мы выявили уже во время перехода.
Проблема асинхронных протоколов (Kafka, IBM MQ, Artemis MQ, Active MQ). Возникает, когда нужна корреляция запросов с ответами для тестирования сервисов, работающих по асинхронным протоколам. Например, для получения статуса транзакции и расчёта задержки по каждому сообщению в случаях, когда:
запрос отправлен с одного генератора нагрузки, а ответ получен другим;
когда работает один генератор, но ответы на запросы вычитываются в произвольном порядке.
Проблема централизованного управления. Появляется, когда много разных тестов от разных пользователей одновременно запускаются на одном тестовом полигоне. Например, если чьи‑то заглушки вычитывают ваши сообщения‑запросы, то вы можете не получить ответы. Или чьи‑то генераторы создают дубли сообщений, и тогда на одно сообщение‑запрос может быть получено более одного ответа.
Проблема с высокой нагрузкой возникла при переходе с предыдущей ESB на Synapse. Нам потребовалось провести ряд нагрузочных тестов, в которых менялась доля нагрузки для различных протоколов, при этом суммарная нагрузка должна была оставаться в пределах 27 000 ТПС. Например, первый тест: 50 % нагрузки по gRPC, 30 % по Kafka и 20 % по HTTP. В последующих тестах изменяются протоколы и доли. С зарубежным решением были проблемы, оно не выдавало требуемую суммарную нагрузку.
Проблема с разработкой тестов. Сейчас существует много разных инструментов для нагрузочного тестирования. В одних нет GUI для создания тестов, в других этот процесс плохо задокументирован, в третьих он непростой. Это создаёт определённые сложности.
Как SyTester решает проблемы
Решение проблемы асинхронных протоколов
Её можно решить несколькими способами.
Первый вариант: send, wait и read в одном потоке. Этот способ хорош тем, что довольно прост в реализации. На каждый запрос мы должны создать поток и ждать в нём ответ. Это немасштабируемое решение, и вскоре у нас закончатся все подключения и потоки. Если этап ожидания будет долгим, то интенсивность нагрузки будет невысокой.
Второй вариант: send и read в разных потоках одного процесса. Он хорош тем, что позволяет отправлять сообщения, используя много подключений, а читать — используя мало подключений. Это помогает подавать гораздо больше нагрузки, что в первом варианте, но использовать немного ресурсов. Правда, потребуется синхронизировать запросы с ответами. Для этого можно использовать локальный кеш. SyTester CE поддерживает такой вариант реализации для нагрузки асинхронных протоколов.
Третий вариант: send и read в разных потоках разных процессов. Он прекрасен тем, что мы уже не ограничены одним генератором нагрузки и можем подавать ещё большую нагрузку. Однако в этом случае нам потребуется внешнее хранилище для синхронизации запросов с ответами. Такой вариант реализован в SyTester Enterprise Edition для нагрузки асинхронных протоколов.
С помощью схемы архитектуры SyTester Enterprise Edition рассмотрим, как мы решали проблему асинхронных протоколов:
SyTester состоит из трёх модулей:
управление;
генератор;
заглушки.
Фактически это поды в Kubernetes. В качестве внешнего хранилища для синхронизации запросов с ответами используется распределенный кеш на основе Apache Ignite. В процессе подачи нагрузки каждый генератор сохраняет запись в виде «ключ‑значение» у себя в локальном кеше и в Ignite. Ключ в этом случае — это уникальный ID запроса, а значение — это время его отправки. Получив ответ, генератор сначала обращается в локальный кеш, и если не находит нужный ID, то запрашивает Ignite. Так происходит корреляция запроса с ответом.
Решение проблемы централизованного управления
Пользователи взаимодействуют с SyTester через управляющий модуль, который распределяет задачи по подам генератора и заглушки. Добавив сюда поддерживаемую ролевую модель из трёх ролей (user, viewer, admin), мы получим решение проблемы централизованного управления.
Вот как это работает:
пользователи с ролью user видят и управляют только своими тестами;
пользователи с ролью viewer видят все тесты от всех пользователей;
пользователи с ролью admin видят и управляют всеми тестами от всех пользователей.
Здесь стоит обратить внимание на возможность управляющего модуля распределять нагрузку. Если нужен тест c большим ТПС (больше, чем может выдать один генератор), то управляющий модуль сам запустит его на необходимом количестве подов генератора. Журналы с этих подов будут доступны как в разрезе каждого пода, так и в общем журнале теста.
Решение проблемы с высокой нагрузкой
Эта проблема решается с помощью штатной возможности масштабирования подов генератора или заглушки в кластере Kubernetes или OSE.
Пример подаваемой нагрузки для HTTP и Kafka, в зависимости от количества подов Kubernetes:
HTTP sync — на каждый запрос ожидается ответ.
Kafka sync — в один топик посылается запрос, ответ вычитывается из другого топика.
Kafka async — в топик посылается запрос, ответ не ожидается,
acks=0
.
SyTester CE, в отличие от EE, не масштабируется, но подойдёт для большинства тестов. Пример нагрузки при запуске тестов на ноутбуке под управлением MacOS Ventura 13.6.7 с OpenJDK 17.0.9, 6‑ядерным Intel Core i7 2,6 ГГц и 16 Гб RAM:
Решение проблемы с разработки тестов
Мы изучили множество инструментов нагрузочного тестирования, а также то, как в них создаются тесты. И для SyTester упростили этот процесс до максимума.
В результате тесты можно создавать в том числе и из GUI. Делать это просто как для генератора, так и для заглушки. Например, чтобы создать генератор или заглушку для gRPC, достаточно загрузить через GUI proto-файл и заполнить параметры подключения к gRPC (см. ниже в демо для gRPC).
Что ещё нужно знать про SyTester
Поддерживаемые протоколы и технологи из коробки:
HTTP;
gRPC;
Kafka;
IBM MQ;
Active MQ;
Artemis MQ.
Для всех протоколов есть возможность настройки SSL.
Особенности инструмента:
поддержка API, с помощью которого можно встроить процесс тестирования в свой CI/CD (примеры команд: загрузить тест, запустить тест, получить результаты и т. п.);
генератор и заглушка доступны из коробки для всех поддерживаемых протоколов;
простой графической интерфейс, из которого можно создать тест и мониторить тестирование;
доступны как встроенные отчёты, так и расширенные;
метрики из коробки: имя сервиса, длительность транзакции, статус транзакции;
возможность изменять ТПС и время завершения теста онлайн во время его исполнения (без перезапуска);
журналы доступны как во время теста, так и после его остановки;
поддержка виртуальных пользователей.
Пример GUI SyTester
Так выглядит окно, в котором отображаются запущенные тесты (на 99 % одинаково для обеих редакций SyTester):
Так выглядит базовый отчёт:
Помимо базового отчёта в EE можно настроить расширенный отчёт. Пример такого дашборда из Grafana:
В редакции EE поддерживаются две модели метрик:
push (custom формат),
pull (формат Prometheus).
На их основе настраивается расширенный отчёт.
Сравнение редакций SyTester EE и SyTester CE
Документация | ||
Работа в кластере k8s/OSE (масштабируемость нагрузки, централизованное управление) | ✓ | — |
Возможность запускать локально (нужна java 17 и выше) | — | ✓ |
Базовый отчёт тестирования | ✓ | ✓ |
Возможность настраивать расширенный отчет тестирования | ✓ | — |
Ролевая модель | ✓ | — |
Интеграция с Keycloak | ✓ | — |
Интеграция с SecMan | ✓ | — |
Поддержка аудита | ✓ | — |
Создание и редактирование тестов из GUI | ✓ | ✓ |
Поддержка протоколов и технологий из коробки | gRPC, Kafka, Artemis MQ, Active MQ, HTTP, IBM MQ | gRPC, Kafka, Artemis MQ, Active MQ, HTTP, IBM MQ |
Модель лицензирования | Входит в лицензию Platform V Synapse Enterprise Integration | Лицензия GitVerse 1.0 |
Варианты установки | Kubernetes/OSE | Поставляется как jar‑файл, для запуска требуется Java 17 и выше |
Где скачать | ЛК СберТех |
По ссылкам доступны демо по созданию генераторов и заглушек для HTTP и gRPC.
Надеюсь, что SyTester поможет максимально упростить процесс нагрузочного тестирования и вы сможете по достоинству оценить этот новый простой инструмент.