Разработка имитатора нагрузки для ведущего поставщика ВКС-систем в РФ
Ведущий разработчик ВКС-систем в России (NDA) при выпуске обновления своего программного обеспечения столкнулся с задачей: провести полномасштабное тестирование продукта в условиях максимальной нагрузки. Чтобы это стало возможно, он обратился к нам для создания имитатора нагрузки.
Цель нашей работы на уровне бизнеса — помочь клиенту подготовиться к сдаче завершённого, готового к высоким нагрузкам решения конечному заказчику ВКС-системы.
Конечный заказчик обозначил конкретные требования, которым должна была соответствовать система, и нашему клиенту было важно качественно протестировать её, чтобы привести в соответствие этим требованиям и продемонстрировать измеримый результат во время сдачи и защиты проекта.
Отраслевая специфика компании-клиента
Отрасль клиента — разработка систем связи — очень консервативна, и это повлияло на выбор технологического стека.
В случае данного проекта мы использовали преимущественно C# и C++ — низкоуровневые языки программирования, лежащие в истоках IT-отрасли. Пишут на них немногие специалисты, в том числе из-за высокой сложности. Поскольку у нас в штате есть подходящие программисты, мы привлекли их к созданию решения.
Ключевые вызовы проекта
- Нашему клиенту было важно показать своему конечному заказчику, что его решение способно выдерживать нагрузку в заданное количество абонентов, подключившихся системе связи при любом возможном сценарии: одновременно, с интервалом в секунду и т. д. Поиск реальных людей, готовых массово поучаствовать в тестировании системы, затруднителен. А готовые решения для такого тестирования не подходят: поскольку универсальный сервис сделать сложно, они слишком «заточены» под конкретные системы, при этом стоимость использования — высокая.
- Усреднённые показатели, такие как длительность звонков, доли видео- и аудио- вызовов, количество событий смены статусов, должны были соответствовать задаваемым режимам тестирования.
- В соответствии с нагрузочным профилем ПО должно было имитировать различные типы задач на ВКС-систему: от массовой смены статусов абонентов до отслеживания статусов узловых станций. Регистрация абонентов в сети тоже учитывалась как нагрузка. Это увеличивало количество и качество требований к системе.
- Авторизация с SSO (single sign-on, технология единого входа) и Kerberos, обеспечивающими пользователям единую точку логина для всех цифровых систем компании клиента — отдельный вызов в контексте настройки интеграции нашей системы с его системой.
- Нам предстояло решать вопросы безопасности на системном уровне: Astra Linux, используемая на стороне клиента, имела много особенностей, поэтому было необходимо выработать свои подходы для работы с ней. Об этом подробнее рассказали ниже.
Наши решения
Создали специализированный под задачи клиента имитатор нагрузки
Первая и главная часть нашей работы.
Мы разработали решение, позволяющее имитировать нагрузку на систему клиента в автоматическом режиме по заданным критериям. Программа конфигурируется на необходимое количество абонентов как в моменте, так и последовательно — и не отличает тестовую нагрузку от реальных пользователей.
Систему можно попросить: «Сымитируй тысячу пользователей». В ответ она отправит тысячу запросов на сервер, поступающих линейно или по кривой.
Таким образом, нагрузка может быть равномерной с определённым количеством запросов в секунду, а может — неравномерной, когда предполагается некий разброс в нагрузке в определённые моменты времени. Все эти сценарии типичны для процесса эксплуатации системы в реальности, поэтому при создании подобных имитаторов нагрузки их нельзя игнорировать.
Ещё важно понимать, что система нагружается не только самим звонком, но и регистрацией sim-карты на телефонной связи, сервисными сообщениями, подключением и отключением абонентов, использованием адресных книг.
Интегрировали имитатор с системой клиента, предполагающей кастомный механизм авторизации
Мы согласовали процесс интеграции с системой и получили необходимые для этого артефакты от клиента. Поддержали протоколы взаимодействия, на которых строится вся связь, подключились к системе и проработали логику.
В ходе проработки логики подняли Asterisk — проверенную виртуальную АТС (Автоматическую Телефонную Станцию) с открытым исходным кодом. Asterisk работала поверх IP-телефонии и имитировала нагрузку, при этом управляли этой АТС мы: давали полноценную нагрузку на систему в тестовом режиме.
Клиент использовал кастомный механизм авторизации: чтобы совершить звонок, каждому пользователю было необходимо авторизоваться в системе на уровне протокола взаимодействия. На фоне этого, задачи интеграции, которые мы выполняли, оказались нетривиальными.
В системе клиента использовалась SSO — и на эти протоколы мы тоже «вставали».
Систему авторизации использовали общую, поскольку необходимо было поддержать авторизационные механизмы, которые предоставляла система клиента.
Для проведения работ с SSO мы должны были взять авторизацию с Kerberos, чтобы Asterisk из-под этого пользователя, этой авторизации, генерил вызов и метрики. А поскольку Astra Linux, операционная система клиента, «резала» пакеты безопасности, нам пришлось найти способ справиться с вопросом обеспечения защиты на системном уровне и адаптировать процесс интеграции под Astra Linux. Мы нашли в Astra Linux определённые настройки, изучили детали взаимодействия с ОС, включили их, и это сработало.
В процессе интеграции с системой клиента, которая использует специфический механизм авторизации, мы успешно выполнили следующие задачи:
- Получили необходимые артефакты от клиента и обеспечили поддержку протоколов взаимодействия, лежащих в основе связи.
- Управляли АТС, создавая полноценную нагрузку в тестовом режиме. (Для имитации нагрузки на систему была запущена Asterisk — надёжная виртуальная АТС с открытым исходным кодом, работающая через IP-телефонию.)
- Реализовали поддержку кастомного механизма авторизации клиента, требующего авторизации каждого пользователя на уровне протокола взаимодействия перед совершением звонка.
- Интегрировали систему по протоколам семейства SSO, используемым клиентом.
- Поддержали общие механизмы авторизации, предоставляемые системой клиента.
- Для работы с SSO мы взаимодействовали с Kerberos для генерации вызовов и метрик от имени авторизованного пользователя.
- Преодолели сложности, связанные с тем, что операционная система клиента Astra Linux блокировала пакеты безопасности. Найдя необходимые настройки и изучив особенности взаимодействия с ОС, мы обеспечили защиту на системном уровне и адаптировали процесс интеграции под Astra Linux.
Ещё нужно было сделать так, чтобы в момент авторизации пользователя Astra Linux отправляла нам пакеты в сеть. Однако в системе клиента, в C++ пакете, использовались настройки, которые не позволяли это сделать. Чтобы имеющиеся настройки обойти и реализовать кастомный механизм авторизации, мы модифицировали Asterisk специфичным образом.
В результате мы обеспечили успешную интеграцию с системой клиента, учитывая все особенности и требования безопасности.
Примечательно, что теперь разработанное для клиента решения можем переиспользовать в других проектах.
Разработали дашборды
Чтобы техническим специалистам со стороны клиента было проще отслеживать нагрузку и то, как система справляется с ними, а также более наглядно демонстрировать решение своему заказчику, мы разработали красивый монитор и дашборды на Grafana.
Сценарии проверки могла задавать команда клиента, на нашей стороне — разработка и отрисовка дашбордов, настройка их связи с базами данных.
Дашборды отражают нагрузку на ЦПУ и многие другие показатели.
Технологический стек и решаемые им задачи
- На C# и C++ мы встраивали в Asterisk модули, писали кастомную авторизацию.
- На .NET разработали основной имитатор (затем система авторизации потребовала модификации Asterisk, и мы его патчили; управляли и модернизировали на C#). Также .NET выбрали для реализации определённых метрик.
- Python использовали совместно с клиентом для обмена данными пользователя, кроме того, некоторые компоненты системы клиента были написаны на этом языке.
- Для работы с кастомной авторизацией взяли C++ и C#.
Состав команды
- Тимлид отдела разработки
- Техлид отдела разработки
- Senior fullstack-программист
- Junior fullstack-программист
- UX/UI-дизайнер
- Middle-тестировщик
Результаты
- Клиент получил отдельное специализированное ПО, которое в соответствии с нагрузочным профилем может имитировать различные типы задач на системе видеосвязи — от массовой смены статусов абонентов видеоконференцсвязи до отслеживания статусов узловых станций. Целевая система, которую наш клиент показал своему конечному заказчику, не отличала тестовую нагрузку от реальной.
- Использование нашего ПО позволило клиенту выявить значительное количество ошибок на этапе тестирования продукта и качественно повысить его надёжность. Автоматизация нагрузочного тестирования позволила включить его в набор стандартных CI-тестов, повысив скорость выпуска новых релизов.
- Цель разработки была достигнута: клиент представил и защитил решение перед своим конечным заказчиком и поделился с нами результатами.