Что такое хаос-инжиниринг
Хаос-инжиниринг — это методология, впервые разработанная в Netflix для тестирования отказоустойчивости вашей системы.
Вы имитируете различные сбои в своей системе с помощью таких инструментов, как Chaos Monkey, Gremlin, AWS Fault Injection Simulator и т.д., а затем измеряете их влияние. Эти инструменты позволяют настроить имитацию сбоев (например, блокировку исходящего DNS-трафика, отключение виртуальных машин, потерю пакетов и т.д.), а затем запланировать их случайный запуск в течение определенного временного окна.
Хаос-инжиниринг задуман как научный процесс, в котором вы выполняете 4 шага.
- Определяете, как ваша система должна вести себя в нормальных условиях, используя количественные измерения, такие как процентили задержки, частота ошибок, пропускная способность и т.д.
- Создаете контрольную и экспериментальную группы. В идеальной реализации вы проводите эксперименты непосредственно с небольшой частью реального пользовательского трафика. В противном случае используете промежуточную среду.
- Моделируете сбои, которые отражают реальные события, такие как сбои сервера, разорванные сетевые подключения и т.д.
- Сравниваете разницу в ваших количественных измерениях между контрольной и экспериментальной группой.
Как правило, хаос-инжиниринг используется для измерения отказоустойчивости серверной части (обычно сервис-ориентированных архитектур).
Однако инженеры Twitch решили использовать методы хаос-инжиниринга для тестирования своего фронтенда. Они хотели ответить на вопрос: «Если какая-то часть их общей системы выйдет из строя, как поведет себя внешний интерфейс и что увидят конечные пользователи?».
Хоаким Вергес, старший разработчик Twitch, написал отличный пост в блоге о процессе хаос-тестирования в Twitch.
Хаос-тестирование в Twitch
Twitch — это веб-сайт для прямых трансляций, на котором создатели контента могут транслировать живое видео для аудитории. У них миллионы вещателей и десятки миллионов ежедневных активных пользователей. В любой момент времени на сайте находится более миллиона пользователей.
Twitch использует сервисно-ориентированную архитектуру для своего бэкэнда, и у них есть сотни микросервисов.
Фронтенд-клиенты используют единый GraphQL API для связи с серверной частью. GraphQL позволяет фронтенд-разработчикам использовать язык запросов для получения точных данных, которые они ищут, вместо того, чтобы вызывать кучу разных конечных REST точек.
Сервер GraphQL имеет уровень преобразователя (resolver), который отвечает за вызов определенных серверных служб для получения всех запрошенных данных.
Наиболее распространенной ошибкой, которая происходит в их системе, является сбой одного из их микросервисов. В этом сценарии GraphQL будет пересылать частичные данные клиенту, и задача клиента — корректно обрабатывать частичные данные и обеспечивать наилучшее возможное ухудшение качества работы.
Инженеры Twitch решили использовать хаос-инжиниринг для тестирования этих сценариев сбоев микросервисов.
Они создали Chaos Mode, в котором они могли передавать дополнительный заголовок вызовам GraphQL в своей staging среде. В заголовке они передают имя серверной службы, для которой они хотят имитировать сбой.
Уровень преобразователя GraphQL прочитает этот заголовок и остановит любой вызов этой службы.
Основная проблема с этим подходом заключалась в том, что Twitch нужно было отправить имя серверной службы в заголовке GraphQL. Следовательно, нужно было иметь список всех различных серверных служб для тестирования.
Функции и службы постоянно меняются, поэтому ручное сопоставление конкретных служб для тестирования было невозможно масштабировать. Им нужен был способ, с помощью которого набор тестов мог бы «обнаружить» сервисы, для которых они должны имитировать сбои.
Чтобы решить эту проблему, Twitch добавил заголовок отладки в свои вызовы GraphQL, который включил трассировку на уровне преобразователя GraphQL. Преобразователи записывают любой вызов метода, выполненный для внутренних зависимостей службы, а затем отправляют информацию обратно клиенту в том же вызове GraphQL.
Оттуда клиент может извлечь имена задействованных служб и использовать их в качестве входных данных для пакета хаос-тестирования.
Визуализация
У Twitch есть много сквозных тестов для всех своих клиентов, которые проверяют различные пользовательские потоки (переход к экрану, вход в систему, отправка сообщения в чат и т.д.).
Они попробовали каждый из этих тестов со всеми сбоями микрослужб в режиме хаоса и посмотрели, был ли тест успешным. Затем они объединили все результаты хаос-тестов для каждого пользовательского потока и использовали их для расчета оценки устойчивости этого конкретного теста действия пользователя.
Показатели устойчивости отображаются на информационной панели, где легко увидеть любые аномалии в производительности. Каждую ночь они запускают тесты Chaos Mode для своих Android-, iOS- и веб-клиентов.
Следующие шаги
Twitch смог использовать этот инструмент тестирования для повышения устойчивости всех своих клиентов.
Сейчас в компании хотят добавить возможность тестировать вторичные микросервисы (сервисы, которые вызываются из другого сервиса, а не просто тестировать сервисы, которые вызываются непосредственно из уровня преобразователя GraphQL).
Они также хотят добавить возможность моделирования сбоев для нескольких сервисов одновременно.
Для получения более подробной информации вы можете прочитать полный пост в блоге здесь.